Tag: java stream

如何对Stream.findNth()进行编码?

与Stream.findFirst()类似,有没有办法编写Stream.findNth() ? 我正在通过重写一些遗留代码来练习Java 8。 而且,我想知道如何使用Stream API编写以下函数。 static curPipeNumber = 0; /** skipToEntry() updates ‘curPipeNumber’ to ‘pipeNumber’ and returns the first byte position of the word before the (‘pipeNumber’)-th pipe. * It does so by reading and ignoring unnecessary bytes from the buffer. * eg, */ static int skipToEntry(byte[] buf, int len, int nextByteToBeRead, int pipeNumber) […]

在Stream中过滤Null项

使用Java Stream时,映射后有时会出现空值。 目前,当需要省略这些值时,我使用: .stream() . .filter(element -> element != null) . 对于更具function性的风格,可以快速编写一个小辅助方法: public static boolean nonNull(T entity) { return entity != null; } 这样您就可以使用方法引用: .stream() . .filter(Elements::nonNull) . 我找不到这样的jdk方法,即使我怀疑他们已经包含了一个。 这里有不同的方法吗? 或者他们是否因为某种原因而省略了这个?

如何使用Java 8流将列表的元素映射到它们的索引?

有了一个字符串列表,我需要构建一个有效对(string, its position in the list) 。 目前我有使用google集合的代码: public Robots(List names) { ImmutableList.Builder builder = ImmutableList.builder(); for (int i = 0; i < names.size(); i++) { builder.add(new Robot(i, names.get(i))); } this.list = builder.build(); } 我想用Java 8流做到这一点。 如果没有索引,我可以这样做: public Robots(List names) { this.list = names.stream() .map(Robot::new) // no index here .collect(collectingAndThen( Collectors.toList(), Collections::unmodifiableList )); } 要获得索引,我必须做这样的事情: […]

流和独特的操作

我有以下代码: class C { String n; C(String n) { this.n = n; } public String getN() { return n; } @Override public boolean equals(Object obj) { return this.getN().equals(((C)obj).getN()); } } List cc = Arrays.asList(new C(“ONE”), new C(“TWO”), new C(“ONE”)); System.out.println(cc.parallelStream().distinct().count()); 但我不明白为什么distinct回报3而不是2。

任何类似filter的lambda操作都不会丢弃?

我基本上想做的事情如下: assertEquals(Arrays.asList(1,2,3).stream() .noDiscardingFilter(x -> x!=1) .map(x -> x*10) .collect(Collectors.toList()), Arrays.asList(1,20,30) ) 这是一个例子,我不需要得到如何解决这个特定问题的答案,这只是一个例子来展示我正在追求的奇特东西。

Java 8中的reduce累加器是否允许修改其参数?

在Java 8中,Stream有一个方法减少: T reduce(T identity, BinaryOperator accumulator); 累加器运算符是否允许修改其任一参数? 我认为不是因为JavaDoc说累加器应该是NonInterfering,尽管所有的例子都谈到修改集合,而不是修改集合的元素。 所以,举一个具体的例子,如果有的话 integers.reduce(0, Integer::sum); 并假设Integer是可变的,并允许sum通过向其添加(就地)第二个参数的值来修改其第一个参数? 我认为不是,但我也想要一个这个干扰导致问题的例子。

如何从Iterator 中创建无限的Stream ?

看看下面我上面写的课: public class FibonacciSupplier implements Iterator { private final IntPredicate hasNextPredicate; private int beforePrevious = 0; private int previous = 1; private FibonacciSupplier(final IntPredicate hasNextPredicate) { this.hasNextPredicate = hasNextPredicate; } @Override public boolean hasNext() { return hasNextPredicate.test(previous); } @Override public Integer next() { int result = beforePrevious + previous; beforePrevious = previous; previous = result; […]

并行flatMap总是顺序的

假设我有这个代码: Collections.singletonList(10) .parallelStream() // .stream() – nothing changes .flatMap(x -> Stream.iterate(0, i -> i + 1) .limit(x) .parallel() .peek(m -> { System.out.println(Thread.currentThread().getName()); })) .collect(Collectors.toSet()); 输出是相同的线程名称,因此这里parallel没有任何好处 – 我的意思是,有一个线程可以完成所有工作。 在flatMap里面有这样的代码: result.sequential().forEach(downstream); 我理解强制sequential属性如果“外部”流是并行的(它们可能会阻塞),“外部”将不得不等待“flatMap”完成,反过来(因为使用相同的公共池)但是为什么总是强迫呢? 这是那些可能在以后的版本中发生变化的事情之一吗?

Stream上的收集操作是否关闭流和底层资源?

以下代码是否需要包含在try-with-resources中以确保底层文件已关闭? List rows = Files.lines(inputFilePath).collect(Collectors.toList());

是否有一种优雅的方式来处理块中的流?

我的确切场景是批量插入数据库,所以我想累积DOM对象然后每1000个,刷新它们。 我通过将代码放入累加器来检测丰满度然后刷新来实现它,但这似乎是错误的 – 刷新控件应该来自调用者。 我可以将流转换为List然后以迭代方式使用subList,但这似乎也很笨拙。 它有一个简洁的方法来采取行动每n个元素然后继续流,而只处理流一次?