Tag: java stream

为什么流api不是为exception处理而设计的?

赛程 BiConsumer<Exception, Consumer> NOTHING = (ex, unused) ->{/**/}; 当我尝试修复@Holger在此答案中报告的错误时: Stream stream = Stream.of(1, 2, 3); // v— the bug I have already fixed, it will throws RuntimeException exceptionally(stream, NOTHING).collect(ArrayList::new, (l, x) -> { l.add(x); if (x < 4) throw new RuntimeException(); }, List::addAll); 一切正常但是当使用Stream.of(T) ,将无限地调用map(…)操作,例如: List result = exceptionally( // v— infinitely call Stream.of(“bad”).map(Integer::parseInt), NOTHING […]

流收集累加器/合并器命令

这基本上是我的这个答案的后续行动。 假设我正在处理自定义收集器并假设accumulator 总是会向供应商返回的集合添加一些元素,是否有可能在调用combiner时,其中一个中间结果将为空? 一个例子可能更容易理解。 假设我有一个数字List ,我想将它拆分为列表列表,其中2是分隔符。 所以例如我有1, 2, 3, 4, 2, 8结果应该是[[1], [3, 4], [8]] 。 这实现起来并不复杂(不要过多地判断代码,我写了一些快速的东西,这样我就可以写出这个问题)。 List<List> result = Stream.of(1, 2, 3, 4, 2, 8) .collect(Collector.of( () -> new ArrayList(), (list, elem) -> { if (list.isEmpty()) { List inner = new ArrayList(); inner.add(elem); list.add(inner); } else { if (elem == 2) { list.add(new ArrayList()); […]

从java中的二维数组流

我试图从一个n维int数组中获取一个IntStream 。 有一个很好的API方法吗? 我知道两个流的连接方法。

如何将Java流转换为滑动窗口?

是否建议将流转换为滑动窗口? 例如,在Ruby中你可以使用each_cons : irb(main):020:0> [1,2,3,4].each_cons(2) { |x| puts x.inspect } [1, 2] [2, 3] [3, 4] => nil irb(main):021:0> [1,2,3,4].each_cons(3) { |x| puts x.inspect } [1, 2, 3] [2, 3, 4] => nil 在Guava中,我发现只有Iterators#partition ,它是相关的,但没有滑动窗口: final Iterator> partition = Iterators.partition(IntStream.range(1, 5).iterator(), 3); partition.forEachRemaining(System.out::println); –> [1, 2, 3] [4]

Java 8 Streams:如何调用Collection.stream()方法并检索具有不同字段的多个聚合值的数组

我从Java 8中的Stream API开始。 这是我使用的Person对象: public class Person { private String firstName; private String lastName; private int age; private double height; private double weight; public Person(String firstName, String lastName, int age, double height, double weight) { this.firstName = firstName; this.lastName = lastName; this.age = age; this.height = height; this.weight = weight; } public String getFirstName() { […]

Java中有限生成的流 – 如何创建一个?

在Java中,可以使用Stream.generate(supplier)轻松生成无限流。 但是,我需要生成一个最终完成的流。 想象一下,例如,我想要一个目录中所有文件的流。 文件数量可能很大,因此我无法预先收集所有数据并从中创建流(通过collection.stream() )。 我需要一块一块地生成序列。 但是流显然会在某个时刻完成,而终端运营商(如( collect()或findAny() )需要对其进行处理,因此Stream.generate(supplier)不适合这里。 有没有合理的简单方法在Java中执行此操作,而不是自己实现整个Stream接口? 我可以想到一个简单的黑客 – 使用无限的Stream.generate(supplier)执行它,并在获取所有实际值时提供null或抛出exception。 但它会破坏标准的流操作符,我只能将它用于我自己的运算符,这些运算符都知道这种行为。 澄清 评论中的人提议我takeWhile()运算符。 这不是我的意思。 如何更好地表达问题…我不是在问如何过滤(或限制)现有的流,我问如何动态创建(生成)流,而不是预先加载所有元素,但是流会有有限的尺寸(事先未知)。 解 我正在寻找的代码是 Iterator it = myCustomIteratorThatGeneratesTheSequence(); StreamSupport.stream(Spliterators.spliteratorUnknownSize(it, Spliterator.DISTINCT), false); 我只是研究了java.nio.file.Files ,如何实现list(path)方法。

我什么时候应该在Java中使用IntStream.range?

我想知道何时可以有效地使用IntStream.range 。 我有三个原因,我不确定IntStream.range是多么有用。 (请将开头和结尾视为整数。) 如果我想要一个数组, [start, start+1, …, end-2, end-1] ,下面的代码要快得多。 int[] arr = new int[end – start]; int index = 0; for(int i = start; i < end; i++) arr[index++] = i; 这可能是因为IntStream.range(start, end).toArray() toArray() IntStream.range(start, end).toArray()非常慢。 我使用MersenneTwister来重排arrays。 (我在网上下载了MersenneTwister课程。)我认为没有办法使用MersenneTwister来IntStream 。 我不认为从start到end-1获取int数字是有用的。 我可以使用for(int i = start; i < end; i++) ,这似乎更容易而且不慢。 你能告诉我什么时候应该选择IntStream.range吗?

将Java8流分组而不收集它

在Java 8中是否有任何方法可以将java.util.stream.Stream的元素分组而不收集它们? 我希望结果再次成为Stream 。 因为我必须处理大量数据甚至无限流,所以我无法先收集数据并再次流式传输结果。 需要分组的所有元素在第一个流中是连续的。 因此我喜欢让流评估变得懒惰。

如何将String拆分为字符串流?

将String拆分为流的最佳方法是什么? 我看到了这些变化: Arrays.stream(“b,l,a”.split(“,”)) Stream.of(“b,l,a”.split(“,”)) Pattern.compile(“,”).splitAsStream(“b,l,a”) 我的优先事项是: 稳健性 可读性 性能 一个完整的,可编译的例子 : import java.util.Arrays; import java.util.regex.Pattern; import java.util.stream.Stream; public class HelloWorld { public static void main(String[] args) { stream1().forEach(System.out::println); stream2().forEach(System.out::println); stream3().forEach(System.out::println); } private static Stream stream1() { return Arrays.stream(“b,l,a”.split(“,”)); } private static Stream stream2() { return Stream.of(“b,l,a”.split(“,”)); } private static Stream stream3() { return Pattern.compile(“,”).splitAsStream(“b,l,a”); } […]

如何在java流中对groupBy应用过滤

如何先分组,然后使用Java流应用过滤? 示例 :考虑此Employee类:我希望按部门分组,其中包含薪水大于2000的员工列表。 public class Employee { private String department; private Integer salary; private String name; //getter and setter public Employee(String department, Integer salary, String name) { this.department = department; this.salary = salary; this.name = name; } } 这就是我如何做到这一点 List list = new ArrayList(); list.add(new Employee(“A”, 5000, “A1”)); list.add(new Employee(“B”, 1000, “B1”)); list.add(new Employee(“C”, 6000, […]