Tag: java stream

什么是Javastream中的“逃生 – 孵化操作”?

我正在阅读Java文档,遇到这样一句话 : 除了escape-hatch操作iterator()和spliterator() ,当调用terminal操作时开始执行,当terminal操作完成时结束。 我不确定什么是“逃生孵化”的意思。 有人能解释这个词吗?

将两个Map <String,Integer>与Java 8 Stream API合并

我有两个(或更多) Map<String, Integer>对象。 我想将它们与Java 8 Stream API进行合并,使得常用键的值应该是值的最大值。 @Test public void test14() throws Exception { Map<String, Integer> m1 = ImmutableMap.of("a", 2, "b", 3); Map<String, Integer> m2 = ImmutableMap.of("a", 3, "c", 4); List<Map<String, Integer>> list = newArrayList(m1, m2); Map<String, Integer> mx = list.stream()… // TODO Map<String, Integer> expected = ImmutableMap.of("a", 3, "b", 3, "c", 4); assertEquals(expected, mx); […]

Java 8 Collectors.toMap SortedMap

我正在使用Java 8 lambdaexpression式,并希望使用Collectors toMap来返回一个SortedMap 。 我能想到的最好的办法是用一个mapSupplier于TreeMap::new的dummy mergeFunction和mapSupplier调用下面的Collectors toMap方法。 public static <T, K, U, M extends Map<K, U>> Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper, BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier) { BiConsumer<M, T> accumulator = (map, element) -> map.merge(keyMapper.apply(element), valueMapper.apply(element), mergeFunction); return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_ID); […]

mapToDouble()对于使用Java 8stream汇总List <Double>真的是必需的吗?

据我所知,使用Java 8stream来对List<Double>进行求和的方式是这样的: List<Double> vals = . . . ; double sum = vals.stream().mapToDouble(Double::doubleValue).sum(); 对于我来说, mapToDouble(Double::doubleValue)似乎是一种蹩脚的 – 就是那种lambda和stream应该放弃的样板“仪式”。 最佳实践告诉我们要优先使用List实例而不是数组,而对于这种总结,数组看起来更清晰: double[] vals = . . . ; double sum = Arrays.stream(vals).sum(); 当然,可以这样做: List<Double> vals = . . . ; double sum = vals.stream().reduce(0.0, (i,j) -> i+j); 但是reduce(….)比sum()长得多。 我知道这与Java的非对象原语需要改进的方式有关,但是我仍然在这里错过了一些东西吗? 有办法挤压自动装箱,使这个更短吗? 或者这仅仅是当前的艺术状态? 更新 – 答案摘要 以下是对以下答案的摘要。 虽然我在这里有一个总结,但我敦促读者自己仔细阅读答案。 @dasblinkenlight解释说,由于在Java历史上进一步的决定,特别是generics被实现的方式以及它们与非对象原语的关系,总是需要某种拆箱。 他指出,编译器理论上可以直观的拆箱,并允许简单的代码,但是这还没有实现。 […]

Java 8 Stream:limit()和skip()之间的区别

谈论Stream ,当我执行这段代码的时候 public class Main { public static void main(String[] args) { Stream.of(1,2,3,4,5,6,7,8,9) .peek(x->System.out.print("\nA"+x)) .limit(3) .peek(x->System.out.print("B"+x)) .forEach(x->System.out.print("C"+x)); } } 我得到这个输出 A1B1C1 A2B2C2 A3B3C3 因为限制我的stream到前三个组件迫使行动A , B和C只能执行三次。 试图通过使用skip()方法对最后三个元素执行类似的计算,显示了不同的行为:this public class Main { public static void main(String[] args) { Stream.of(1,2,3,4,5,6,7,8,9) .peek(x->System.out.print("\nA"+x)) .skip(6) .peek(x->System.out.print("B"+x)) .forEach(x->System.out.print("C"+x)); } } 输出这个 A1 A2 A3 A4 A5 A6 A7B7C7 A8B8C8 A9B9C9 为什么在这种情况下,正在执行A1到A6的动作? […]

取符合条件的第一个元素

如何获得匹配stream中的条件的第一个元素? 我试过这个,但不起作用 this.stops.stream().filter(Stop s-> s.getStation().getName().equals(name)); 该条件不起作用,filter方法在Stop以外的其他类中调用。 public class Train { private final String name; private final SortedSet<Stop> stops; public Train(String name) { this.name = name; this.stops = new TreeSet<Stop>(); } public void addStop(Stop stop) { this.stops.add(stop); } public Stop getFirstStation() { return this.getStops().first(); } public Stop getLastStation() { return this.getStops().last(); } public SortedSet<Stop> getStops() { […]

Java 8stream与批处理

我有一个包含项目列表的大文件。 我想创build一批物品,用这个批处理做一个HTTP请求(在HTTP请求中所有这些项都需要作为参数)。 我可以用for循环很容易地做到这一点,但是作为Java 8的爱好者,我想尝试用Java 8的Stream框架来编写这个代码(并获得延迟处理的好处)。 例: List<String> batch = new ArrayList<>(BATCH_SIZE); for (int i = 0; i < data.size(); i++) { batch.add(data.get(i)); if (batch.size() == BATCH_SIZE) process(batch); } if (batch.size() > 0) process(batch); 我想做一些lazyFileStream.group(500).map(processBatch).collect(toList()) 什么是最好的方法来做到这一点?

深入分析者的特点

为了试图深入理解javastream和分割器,我有一些关于分割器特性的细微问题: Q1: Stream.empty() vs Stream.of() (Stream.of()没有参数) Stream.empty() : 已经过时,已经大小 Stream.of() :已预订, 不可预约 ,已预订,已预订 为什么Stream.empty()没有Stream.empty()的相同特征? 请注意,它与Stream.concat()(特别是没有ORDERED )一起使用时会产生影响。 我会说, Stream.empty()应该不只是IMMUTABLE和ORDERED,但也DISTINCT和NONNULL 。 也有道理Stream.of()只有一个参数有DISTICT 。 Q2: LongStream.of()没有NONNULL 只注意到NONNULL在LongStream.of不可用。 是不是NONNULL是所有LongStream , IntStream和DoubleStream的主要特征? Q3: LongStream.range(,)与LongStream.range(,).boxed() LongRange.range(,) :已预订, 不可更改,不可空,已大小,已sorting,已sorting,已排除 LongStream.range(,).boxed() : 已订购,已订购,已订购 为什么.boxed()失去了所有这些特征? 它不应该失去任何。 我知道.mapToObj()可能会失去NONNULL,IMMUTABLE和DISTICT ,但.boxed() …没有任何意义。 Q4: .peek()失去IMMUTABLE和NONNULL LongStream.of(1) : SUBSIZED,IMMUTABLE,NONNULL,SIZED,… LongStream.of(1).peek() : SUBSIZED,SIZED,… 为什么.peek()失去了这些特征? .peek不应该真的失去任何。 Q5: .skip() .limit()失去了SUBSIZED,IMMUTABLE,NONNULL,SIZED 只要注意,这些操作失去了SUBSIZED,IMMUTABLE,NONNULL,SIZED 。 […]

如何检查Java 8stream是否为空?

如何检查Stream是否为空,如果不是,则作为非terminal操作抛出exception? 基本上,我正在寻找相当于下面的代码,但没有实现中间的stream。 特别是,在stream被terminal操作实际消耗之前,检查不应该发生。 public Stream<Thing> getFilteredThings() { Stream<Thing> stream = getThings().stream() .filter(Thing::isFoo) .filter(Thing::isBar); return nonEmptyStream(stream, () -> { throw new RuntimeException("No foo bar things available") }); } private static <T> Stream<T> nonEmptyStream(Stream<T> stream, Supplier<T> defaultValue) { List<T> list = stream.collect(Collectors.toList()); if (list.isEmpty()) list.add(defaultValue.get()); return list.stream(); }

是否允许/build议重用收集器?

我在代码中有很多地方可以做: someStream.collect(Collectors.toList()) Collectors.toList()在每个用途上创build一个新的收集器。 这就引出了一个问题,如果允许和可取的做一些事情,比如: private final static Collector<…> TO_LIST = Collectors.toList() 对于我使用的每种types,然后使用单个收集器: someStream.collect(TO_LIST) 当需要收集器时。 由于收集器是无状态的,只是function和特性的集合,所以我认为它应该起作用,但是OTOH, Collectors.toList()会在每次调用时创build一个新的CollectorImpl<> 。 重复使用收集器有什么缺点?