Tag: lambda

比Stream.peek()更好的方法

“peek”主要用于调试。 如果我想在流的中间调用流上的方法,这会改变流对象的状态。 Stream.of(“Karl”, “Jill”, “Jack”).map(Test::new).peek(t->t.setLastName(“Doe”)); 我可以: Stream.of(“Karl”, “Jill”, “Jack”).map(Test::new).map(t->{t.setLastName(“Doe”); return t;}); 但这看起来很难看。 这是不应该做的事还是有更好的方法来做到这一点? 编辑: forEach工作除了它是一个终端操作,因此你不能继续在流上工作。 然后我希望制作一个Collection,do forEach,然后再开始流式传输Collection。 编辑: map(Class::processingMethod)是我现在正在做的,但由于processingMethod只是返回this ,它似乎是对map的误用。 此外,它并不像业务逻辑那样真正地读取。 最终编辑:我接受了@Holger的回答。 不能期望Stream.peek处理Stream上的所有元素,因为它不是终端操作。 map 。 即使您可能已经使用某些内容来终止您的流,这些内容可以保证它将处理所有操作,但您不应该编写希望每个用户都这样做的代码。 因此,要进行处理,您应该在Collection上使用forEach ,然后根据需要再次开始流式传输。

有一种优雅的方法来获取Java中多个方法返回的第一个非null值吗?

你自己已经看过很多次了,我敢肯定: public SomeObject findSomeObject(Arguments args) { SomeObject so = queryFirstSource(args); // the most likely source first, hopefully if (so != null) return so; so = querySecondSource(args); // a source less likely than the first, hopefully if (so != null) return so; so = queryThirdSource(args); // a source less likely than the previous, hopefully if (so […]

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)) […]

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

编辑:我的问题在这里得到了解答。 总而言之,我对非静态方法引用的使用感到困惑。 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 […]

具有Lambda表达式的线程

我在第42和43行有一个错误: Thread t1=new Thread(()->prod.test()); , Thread t2=new Thread(()->cons.test()); 未处理的exception类型InterruptedException 。 如果我尝试quickfix它将创建带有捕获exception的try catch,它将具有相同的错误并将尝试以相同的方式修复它继续用try catch包围它。 import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; interface Predicate { public void test() throws InterruptedException; } class MyClass { int num = 0; Lock lock = new ReentrantLock(); public void produce() throws InterruptedException { lock.lock(); for (int i = 0; i < 1000; i++) { […]

java允许使用function接口作为方法吗?

使用新的java lambdas和function接口的概念,是否可以将这些function接口视为方法? interface Func { void execute(int i); } void call(Func f) { f(1); //instead of f.execute(1); } 我发现了很多关于实际lambda表达式语法的信息,但没有任何相关信息。

setter的Lambda表达式

我们可以使用lambda表达式获取getter,如下所示 Function studentNameGetter = Student::getName; 如何为setter创建lambda表达式?

用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 。 包括来自相当基本测试的日志输出。

比较集合内的集合

我有这样的一套: Set<Set> NestedSet = new HashSet<Set>(); [[Node[0], Node[1], Node[2]], [Node[0], Node[2], Node[6]], [Node[3], Node[4], Node[5]]] 我想比较和合并嵌套集内的集合。 [0,1,2]和[0,2,6]具有共同的要素。 所以应该合并它们形成0,1,2,6。 输出应该是这样的: [[Node[0], Node[1], Node[2], Node[6]], [Node[3], Node[4], Node[5]]] 有没有有效的方法?

如何使流管道更简单

我认为我的代码需要改进。 我在流的filter()和map()阶段使用对象allSummaryTSTLog ,所以我必须调用File.listFiles两次: public static List ParserPath(List allLogPath) { FilenameFilter filter = new MyFilter(“Summary_TSTLog”); return allLogPath.parallelStream().filter(path -> { File testPath = new File(path); if (!testPath.isDirectory()) { MyLog.log.info(“test path : [” + path + “] is not exist, continue”); return false; } File[] allSummaryTSTLog = testPath.listFiles(filter); if (allSummaryTSTLog == null || allSummaryTSTLog.length == 0) { MyLog.log.info(“test […]