Tag: lambda

Java:使用lambda为文件添加行号的优雅方法

我习惯使用lambda逐行解析文件(比bufferedReader.readLine()更整洁)。 但今天我遇到了一个问题:为每一行添加一个行号。 它需要一个计数器,但lambda中的变量应该是最终的。 最后,我用一个int数组攻击它。 码: public static void main(String[] args) { int[] counter = new int[1]; counter[0] = 0; try (Stream lines = Files.lines(Paths.get(“/tmp/timeline.txt”), Charset.defaultCharset())) { lines.limit(10).forEachOrdered(line -> { line = line.trim(); counter[0] ++; System.out.println(“Line ” + counter[0] + “: ” + line); }); } catch (IOException e) { e.printStackTrace(); } } 输出: Line 1: […]

在Java 8中懒惰地返回第一个非空列表

我有N个列表从存储库返回数据。 我想返回这三个列表中的第一个非空(每个列表执行不同的SQL来获取数据)。 问题是我想懒得这样做,所以如果我已经找到了可接受的结果,我就不需要在数据库上执行SQL。 我的代码是(修改过的) @Override public List dataService(Data data) { return firstNonEmptyList(repository.getDataWayOne(data.getParameter()), repository.getDataWayTwo(data.getParameter()), repository.getDataWayThree(data.getParameter().getAcessoryParameter()) Collections.singletonList(repository.getDefaultData(data.getParameter())); } @SafeVarargs private final List firstNonEmptyList(List… lists) { for (List list : lists) { if (!list.isEmpty()) { return list; } } return null; } 这有效,但它不是懒惰的。 有任何想法吗?

为什么Java 8 Stream forEach方法的行为有所不同?

根据我对java 8 lambda表达式的理解,如果我们在花括号中不包含“ – >”之后的代码,那么将隐式返回值。 但是在下面的示例中, forEach方法期望Consumer和expression返回值,但编译器在Eclipse中没有给出错误。 List messages = Arrays.asList(new StringBuilder(), new StringBuilder()); messages.stream().forEach(s-> s.append(“helloworld”));//works fine messages.stream().forEach((StringBuilder s)-> s.append(“helloworld”)); //works fine messages.stream().forEach(s-> s); // doesn’t work , Void methods cannot return a value messages.stream().forEach(s-> s.toString()); // works fine messages.stream().forEach(s-> {return s.append(“helloworld”);}); // doesn’t work , Void methods cannot return a value messages.stream().forEach((StringBuilder s)-> {return […]

连接List中所有Maps的String值

我正在尝试调整Lambdafunction,但是在这里和那里很少有挣扎。 List<Map> list = new LinkedList(); Map map = new HashMap(); map.put(“data1”, “12345”); map.put(“data2”, “45678”); list.add(map); 我只想以逗号分隔格式打印值,如12345,45678 所以这是我的审判 list.stream().map(Map::values).collect(Collectors.toList()) //Collectors.joining(“,”) 输出为[[12345,45678]] 。 这意味着,有一个列表和内部列表,它在0索引处创建逗号分隔值。 我明白为什么会这样做。 但是我没有通过如何提取我想要的结果,除非我在该表达式的末尾调用.get(0) 。 任何有关如何更好地使用lambdas的帮助/更多见解将会有所帮助

Java 8中记忆的无限Fibonacci序列

首先,我是一名JavaScript程序员,对Java8很新,并尝试新的function。 由于我专注于JS编码,我实现了自己的JS懒惰函数库来进行概念validation。 https://github.com/kenokabe/spacetime 使用该库,我可以编写无限序列的自然数和Fibonacci ,如下所示: JavaScript的 var spacetime = require(‘./spacetime’); var _ = spacetime.lazy(); var natural = _(function(n) //memoized automatically { return n; // Natural numbers is defined as the `n`th number becomes `n` }); var natural10 = _(natural) .take(10) .compute(function(x) { console.log(x); }); //wrap a recursive function to memoize // must be at the […]

编译错误:Lambda目标类型交集类型

public class X { Object o = (I & J) () -> {}; } interface I { public void foo(); } interface J { public void foo(); public void bar(); } Oracle编译器抛出错误: X.java:2: error: incompatible types: INT#1 is not a functional interface Object o = (I & J) () -> {}; ^ multiple non-overriding abstract […]

我需要使用Java 8 Optional方法获取包装值,或者调用void返回Consumer lambda

我不熟悉在Java 8中使用选项。我知道方法orElseGet()需要一个供应商,orElseThrow()也需要一个抛出exception的供应商。 orElseThrow()可能是一个很好用的,如果我可以构造自己的exception并在触发该exception时执行某些操作。 我的主要目标是使用一个方法来获取未包装的值,或者如果可选的包装为null,则实际执行一个完全不同的函数。 寻找最接近的东西: class DoInsteadClass { public void doInstead() { // Do this instead } } Optional myString = “Hello”; num.orElse(DoInsteadClass::doInstead); 如果执行此操作的唯一方法是orElseThrow(),并且只要我可以使用’do this instead’代码处理exception,那也应该没问题。 它只是使我的代码库更大,因为我必须为2或3个案例创建一些不同的自定义实用程序供应商,其中一些可选值将返回null。 问题是,.ifPresent()用值调用指定的使用者,否则什么也不做。 如果值为null,我需要它来进行SOMETHING。 我当前的代码使用自定义的解决方法,我首先检查值是否为null,如果是,则执行所选的函数。 然后下一个语句是检查ifPresent()的语句。 所以这是做同样的事情,我只是在寻找更多糖衣,一个声明版本。

API中的奇怪语法“String :: concat”

我正在研究使用1.8对Java SE API所做的一些更改,我在查看新方法Map.merge时,它显示了如何将其与行一起使用的示例 map.merge(key, msg, String::concat) 我理解如何使用lambda表达式来创建匿名function接口,但这似乎使用一个方法作为BiFunction。 我喜欢理解和使用晦涩的java语法,但我无法在任何地方找到任何提及。

内在函数和内联对Lambda性能的影响?

我已经使用了这个基准测试java8-lambda-performance-test ,在运行它时我做了以下几点: 1.Disabled内在用法 2.Disabled Inlining 3.Disabled编译模式 我发现禁用两个第一次优化对结果没有影响。 这很奇怪,而且当运行基准测试和打印内在时,我没有找到任何调用内在的compiledLambdaForm 由于数学内在函数大量使用_min,_pow …我期待禁用内在函数会降低性能

C ++ 0x – lambda表达式看起来和Java的匿名内部类一样吗?

我在c ++和Java上下文中对lambda表达式的解释是否正确?