Tag: java stream

Java 8 – 如何使用带参数函数的谓词?

我有以下代码: public boolean isImageSrcExists(String imageSrc) { int resultsNum = 0; List blogImagesList = driver.findElements(blogImageLocator); for (WebElement thisImage : blogImagesList) { if (thisImage.getAttribute(“style”).contains(imageSrc)) { resultsNum++; } } if (resultsNum == 2) { return true; } else { return false; } } 将其转换为使用Java 8 Stream的正确方法是什么? 当我尝试使用map() ,我得到一个错误,因为getAttribute不是一个Function 。 int a = (int) blogImagesList.stream() .map(WebElement::getAttribute(“style”)) .filter(s -> s.contains(imageSrc)) […]

命名返回流的java方法

是否有返回Stream的方法的命名约定? 我发现唯一提到的就是关于SO的答案 (最后一段),但我不知道它的基础是什么。

使用双冒号 – 静态和非静态方法引用之间的差异

编辑:我的问题在这里得到了解答。 总而言之,我对非静态方法引用的使用感到困惑。 function接口和参考方法具有不同数量的参数。 回答我的问题的是评论和接受的答案。 我目前正在阅读关于流减少方法的Java教程( https://docs.oracle.com/javase/tutorial/collections/streams/reduction.html )。 在那里,我发现了一段我认为错误的代码,所以我做了一个更简单的代码来确保。 // B.java file import java.util.*; public class B { public static void main(String[] args) { List zahlen = new LinkedList(); zahlen.add(1); zahlen.add(2); zahlen.add(3); Averager averageCollect = zahlen.stream() .collect(Averager::new, Averager::addcount, Averager::combine); System.out.println(averageCollect.average()); } } // Averager.java from the official Java tutorial public class Averager { private int total […]

在mapToInt之后调用map是否有任何优势,如果需要的话

我试图计算列表中值的平方和。 以下是三种变体,它们都计算出所需的值。 我想知道哪一个最有效率。 我期待第三个更高效,因为自动装箱只进行一次。 // sum of squares int sum = list.stream().map(x -> x * x).reduce((x, y) -> x + y).get(); System.out.println(“sum of squares: ” + sum); sum = list.stream().mapToInt(x -> x * x).sum(); System.out.println(“sum of squares: ” + sum); sum = list.stream().mapToInt(x -> x).map(x -> x * x).sum(); System.out.println(“sum of squares: ” + sum);

Java流filter值的总和

我有一个名为MonitoredData的类,用于描述一个活动,它的开始时间和结束时间。 属性为activityLabel , startTime , endTime 。 我必须使用流来划分和过滤这些活动,这些活动的总持续时间超过10小时。 我设法计算持续时间的总和,并根据活动将它们分组使用: Map map4 = new HashMap(); map4 = data.stream() .collect( Collectors.groupingBy( MonitoredData::getActivity, Collectors.summingLong(MonitoredData::getDuration) ) ); //getDuration returns end Time – startTime in milliseconds 但我还没有设法添加filter。 我试过用: .filter(Collectors.summingLong(MonitoredData::getDuration) > whatever) 但显然它不起作用。 我如何解决这个问题才能使它返回Map ?

Stream.spliterator对并行流的奇怪行为

我正在使用流分裂器直接用于我正在编写的库中的低级操作。 最近,当我使用流分裂器和交错tryAdvance/trySplit调用时,我发现了非常奇怪的行为。 这是一个简单的代码,演示了这个问题: import java.util.Arrays; import java.util.Spliterator; public class SpliteratorBug { public static void main(String[] args) { Integer[][] input = { { 1 }, { 2, 3 }, { 4, 5, 6 }, { 7, 8 }, { 9 } }; Spliterator spliterator = Arrays.stream(input).parallel() .flatMap(Arrays::stream).spliterator(); spliterator.trySplit(); spliterator.tryAdvance(s -> {}); spliterator.trySplit(); spliterator.forEachRemaining(System.out::println); } } 输出是 […]

用Java 8 Streams替换传统的newForLoop

因此,最后从Java 6跳到Java 8,我已经阅读了相当数量的Java 8 Streams API。 不幸的是,几乎所有被问到的例子几乎都接近于我想要弄清楚怎么做,但还不够接近。 我拥有的是什么 final List<Function> myList = generateList(); final double myVal = calculate(10); private double calculate(double val) { for (Function function : this.myList) { val += function.apply(val); } return val; } 现在,我已经明白我可以使用.stream().forEach()做类似的事情,但这只适用于foreach和流需要最终变量。 我试图用DoubleStream探索一下得到一个sum() ,但是我需要将当前的和重新应用到每个Function并将该和加到下一个函数中,如上面的代码示例所示。 这可以用纯Stream API吗? 编辑:因此在使用reduce()区域进行测试后,我对执行此类计算所花费的时间进行了简单测试,结果不支持流。 这是一个示例https://gist.github.com/gabizou/33f616c08bde5ab97e56 。 包括来自相当基本测试的日志输出。

Java,哪个线程是顺序流执行的?

在阅读有关流的文档时,我遇到了以下句子: …试图从行为参数中访问可变状态会给你一个错误的选择…如果你没有同步访问该状态,你就会有数据竞争,因此你的代码被破坏…… [1] 如果行为参数确实有副作用…… [没有]保证在同一个线程中执行同一流管道中“相同”元素的不同操作。 [2] 对于任何给定元素,可以在任何时间以及库选择的任何线程中执行该动作。 [3] 这些句子不区分顺序流和并行流。 所以我的问题是: 在哪个线程中执行顺序流的管道? 它总是调用线程还是一个可以自由选择任何线程的实现? 在流是顺序的情况下,哪个线程是forEach终端操作的action参数? 使用顺序流时是否必须使用任何同步? [1 + 2] https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html [3] https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#forEach-java.util.function.Consumer-

如何创建Stream ,只有一个元素与Stream.of?

使用Stream.of创建通用流非常方便,但是如果我想创建只有一个元素的Stream呢? 假设我有: String[] tropicalFruits = new String[] {“pineapple”, “banana”, “mango”}; String[] fruits = new String[] {“melon”, “peach”, “apple”}; 然后Stream.of(tropicalFruits, fruits)生成两个元素的Stream 。 如何为单个元素的流实现相同的function? 如果我尝试: Stream fruittyStream = Stream.of(tropicalFruits); 我明白了: 错误:不兼容的类型:推理变量T具有不兼容的边界 等式约束: java.lang.String[] 下界: java.lang.String Stream fruittyStream = Stream.of(fruits); ^—————^ 我用Google搜索并搜索了但是我什么也没得到。 在我看来,这不是一个非常不寻常的或esoeteric问题,所以有点令人惊讶我没有得到任何答案(或者我没有用正确的关键词搜索)。

Java Streams:获取按内部映射键分组的值

我有Map<A, Map> ,我希望使用Java Streams从中获取Map<B, List> 。 我尝试按如下方式进行: public Map<B, List> groupsByInnerKey(Map<A, Map> input) { return input.values() .stream() .flatMap(it -> it.entrySet().stream()) .collect(Collectors.groupingBy(Map.Entry::getKey)); } 我期待的是: flatMap给出Map.Entry collect(Collectors.groupingBy(…))获取应用于Map.Entry函数并返回B ,因此它将C值收集到List 。 但它没有编译,字面意思: 无法从静态上下文引用非静态方法 在最后一行的Map.Entry::getKey中。 有人可以解释什么是错的或什么是实现我想要的正确方法?