Tag: java stream

为什么我可以将并行流收集到任意大型数组而不是顺序流?

从回答这个问题开始 ,我遇到了一个奇特的特征。 下面的代码按照我的假设工作(现有数组中的前两个值将被覆盖): Integer[] newArray = Stream.of(7, 8) .parallel() .toArray(i -> new Integer[] {1, 2, 3, 4, 5, 6}); System.out.println(Arrays.toString(newArray)); 输出: [7, 8, 3, 4, 5, 6] 但是,使用顺序流尝试此操作会抛出IllegalStateException : Integer[] newArray = Stream.of(7, 8) .toArray(i -> new Integer[] {1, 2, 3, 4, 5, 6}); System.out.println(Arrays.toString(newArray)); 输出: Exception in thread “main” java.lang.IllegalStateException: Begin size 2 is […]

使用Java 8集合流API进行堆栈

我有一个方法,每次执行它时都会生成一个对象,我需要颠倒我获取它们的顺序。 所以我认为这样做的自然方式是Stack,因为它是LIFO。 但是,Java Stack似乎不能与新的Java 8流API一起使用。 如果我这样做: Stack stack = new Stack(); stack.push(“A”); stack.push(“B”); stack.push(“C”); List list = stack.stream().collect(Collectors.toList()); System.out.println(“Collected: ” + list); 我得到的输出是: Collected: [A, B, C] 为什么不以预期的LIFO顺序将它们输出到流中? 这是将所有项目从堆栈清除到右(LIFO)订单列表的正确方法吗?

如果Map中的所有List值都为空/非空,则使用Streams返回Boolean

给定Map将String映射到List ,有没有办法使用Java Streams返回一个布尔值,其中TRUE表示一个或多个列表有元素? 如果地图中的所有列表都为空,则返回FALSE。 Map< String , List > map = … 可以使用Streams替换这个传统代码吗? // See if any diffs were found. Loop through the Map, look at each List of diffs to see if non-empty. boolean anyElementsInAnyList = false; for (List list : map.values () ) { if (!list.isEmpty()) { anyElementsInAnyList = true; break; } } […]

在一个流中进行多次“匹配”检查

是否可以检查数组(或集合)是否包含元素5 和 5以外的元素。在一个流中返回布尔结果而不是使用两个流: int[] ints = new int[]{1, 2, 3, 4, 5}; boolean hasFive = IntStream.of(ints).anyMatch(num -> num == 5); boolean hasNonFive = IntStream.of(ints).anyMatch(num -> num != 5); boolean result = hasFive && hasNonFive;

在Java 8中限制groupBy

如何通过每个条目限制groupBy? 例如(基于此示例: stream groupBy ): studentClasses.add(new StudentClass(“Kumar”, 101, “Intro to Web”)); studentClasses.add(new StudentClass(“White”, 102, “Advanced Java”)); studentClasses.add(new StudentClass(“Kumar”, 101, “Intro to Cobol”)); studentClasses.add(new StudentClass(“White”, 101, “Intro to Web”)); studentClasses.add(new StudentClass(“White”, 102, “Advanced Web”)); studentClasses.add(new StudentClass(“Sargent”, 106, “Advanced Web”)); studentClasses.add(new StudentClass(“Sargent”, 103, “Advanced Web”)); studentClasses.add(new StudentClass(“Sargent”, 104, “Advanced Web”)); studentClasses.add(new StudentClass(“Sargent”, 105, “Advanced Web”)); 此方法返回简单组: Map<String, […]

如何使用Java 8流和filter过滤嵌套循环?

如何使用java8流和filter过滤嵌套循环? 假设我有一个汽车List ( List ),每辆汽车都有一个Engines List ( List ),每个引擎都有一个List 。 在常规Java中,这种结构可以描述为: for(Car car : cars) { for (Engine engine : car.getEngines()) { for (Part part : engine.getParts()) { // … } } } 假设我将汽车列表初始化为: List cars = new ArrayList(Arrays.asList(new Car(), new Car(), new Car())); cars.get(0).setEngines(null); cars.get(1).setEngines(new ArrayList()); cars.get(2).setEngines(new ArrayList() {{ add(new Engine()); add(null); add(new Engine()); […]

将对象属性列表加入String

我现在正在学习lambda,我想知道如何用lambda的单行编写这段代码。 我有一个Person类,其中包含ID和name字段 目前,我有一个List存储这些Person对象。 我想要完成的是获取一个由人的id组成的字符串。 “id1,id2,id3” 。 我怎样才能用lambda实现这个目标?

为什么System.out :: println比Java 8中的匿名类实现慢?

我正在使用一些Java 8 Stream API。 我很困惑地看到以下两个解决方案之间的性能差异,即只打印Stream的内容。 解决方案1: int[] array = new int[] { 0, 1, 2, 3, 4, 5 }; start = System.nanoTime(); Arrays.stream(array).forEach(System.out::println); System.out.println((System.nanoTime() – start) / 1000000.0f); 解决方案2: int[] array = new int[] { 0, 1, 2, 3, 4, 5 }; start = System.nanoTime(); Arrays.stream(array).forEach(new IntConsumer() { @Override public void accept(int value) { System.out.println(value); […]

在Java 8 Stream中解决没有最终变量

有没有办法将以下代码转换为Java 8 Stream。 final List ret = new ArrayList(values.size()); double tmp = startPrice; for (final Iterator it = values.iterator(); it.hasNext();) { final DiscountValue discountValue = ((DiscountValue) it.next()).apply(quantity, tmp, digits, currencyIsoCode); tmp -= discountValue.getAppliedValue(); ret.add(discountValue); } Java 8流抱怨没有最终变量tmp? 有办法解决这种情况吗? 在封闭范围内定义的局部变量tmp必须是最终的或有效的最终

为什么stream.spliterator()的tryAdvance可能会将项目累积到缓冲区中?

从Stream管道获取Spliterator可能会返回StreamSpliterators.WrappingSpliterator的实例。 例如,获取以下Spliterator : Spliterator source = new Random() .ints(11, 0, 7) // size, origin, bound .filter(nr -> nr % 2 != 0) .mapToObj(Integer::toString) .spliterator(); 给定上面的Spliterator source ,当我们通过tryAdvance (Consumer consumer)方法单独遍历元素时,在这种情况下,它是StreamSpliterators.WrappingSpliterator的一个实例,它将首先将项目累积到内部缓冲区,在使用这些项之前,我们可以在StreamSpliterators.java#298中看到。 从简单的角度来看, doAdvance()首先将项插入buffer ,然后获取下一个项并将其传递给consumer.accept (…) 。 public boolean tryAdvance(Consumer consumer) { boolean hasNext = doAdvance(); if (hasNext) consumer.accept(buffer.get(nextToConsume)); return hasNext; } 但是,我不知道需要这个buffer 。 在这种情况下,为什么tryAdvance的consumer参数不仅仅用作管道的终端Sink ?