Tag: lambda

lambda表达式中的错误返回类型

以下代码在IntelliJ和Eclipse中编译良好,但JDK编译器1.8.0_25抱怨。 一,代码。 import java.util.function.Predicate; public abstract class MyStream { static MyStream create() { return null; } abstract MyStream filter(MyPredicate predicate); public interface MyPredicate extends Predicate { @Override boolean test(T t); } public void demo() { MyStream. create().filter(b -> b); MyStream. create().filter(s -> s != null); } } javac 1.8.0_25的输出是: MyStream.java:18: error: incompatible types: incompatible parameter […]

带generics的LambdaConversionException:JVM错误?

我有一些带有方法引用的代码,它可以很好地编译并在运行时失败。 例外是这样的: Caused by: java.lang.invoke.LambdaConversionException: Invalid receiver type class redacted.BasicEntity; not a subtype of implementation type interface redacted.HasImagesEntity at java.lang.invoke.AbstractValidatingLambdaMetafactory.validateMetafactoryArgs(AbstractValidatingLambdaMetafactory.java:233) at java.lang.invoke.LambdaMetafactory.metafactory(LambdaMetafactory.java:303) at java.lang.invoke.CallSite.makeSite(CallSite.java:289) 这个class是这样的: class ImageController { void doTheThing(E entity) { Set filenames = entity.getImages().keySet().stream() .map(entity::filename) .collect(Collectors.toSet()); } } 尝试解析entity :: filename会抛出exception。 filename()在HasImagesEntity上声明。 接近我可以说,我得到了exception,因为E的擦除是BasicEntity而JVM没有(不能?)考虑E上的其他边界。 当我将方法引用重写为一个普通的lambda时,一切都很好。 对我来说,一个构造按预期工作并且它的语义等价物爆炸似乎真的很可疑。 这可能是在规范中吗? 我正在努力寻找一种不会在编译器或运行时出现问题的方法,并且没有提出任何建议。

用于int范围的Java 8 IntStream?

有没有办法为一系列的int创建一个IntStream ? 就像我想要将值1到1000流,我可以调用一些IntStream静态工厂来传输该范围? IntStream.forRange(1, 1000).forEach(//do something…

将for循环转换为concat String转换为lambda表达式

我有以下for循环,它循环遍历字符串列表并将每个单词的第一个字符存储在StringBuilder 。 我想知道如何将其转换为lambda表达式 StringBuilder chars = new StringBuilder(); for (String l : list) { chars.append(l.charAt(0)); }

为什么过滤未排序的列表比过滤排序列表更快

我一直在玩Java 8 Streams – API ,我决定使用microbenchmark stream()和parallelStream()流。 正如预期的那样, parallelStream()速度提高了两倍,但是其他东西弹出 – 如果我在将数据传递给filter之前对数据进行排序,则需要花费5-8倍的时间来filter->map->collect结果,而不是传递未排序的列表。 未分类 (Stream) Elapsed time [ns] : 53733996 (53 ms) (ParallelStream) Elapsed time [ns] : 25901907 (25 ms) 排序 (Stream) Elapsed time [ns] : 336976149 (336 ms) (ParallelStream) Elapsed time [ns] : 204781387 (204 ms) 这是代码 package com.github.svetlinzarev.playground.javalang.lambda; import static java.lang.Long.valueOf; import java.util.ArrayList; import java.util.List; […]

Java 8 mapToInt(mapToInt(e – > e))如何提高性能?

我正在阅读“Java 8 Lambdas”这本书,并且在某些时候作者说:“由于性能优势,尽可能使用原始专用函数是个好主意。” 他在这里指的是mapToInt,mapToLong等。 事情是我不知道性能来自哪里说实话。 我们来看一个例子: // Consider this a very very long list, with a lot of elements List list = Arrays.asList(1, 2, 3, 4); //sum it, flavour 1 int sum1 = list.stream().reduce(0, (acc, e) -> acc + e).intValue(); //sum it, flavour 2 int sum2 = list.stream().mapToInt(e -> e).sum(); System.out.println(sum1 + ” ” + […]

FilenameFilter的java 8 lambda表达式

我正在浏览java 8中的lambda表达式 当我改变线程代码时,它工作正常 new Thread(new Runnable() { @Override public void run() { System.out.println(“run”); } }).start(); 转换为lambda表达式为 new Thread( () -> System.out.println(“Hello from thread”) ).start(); 但我无法转换FilenameFilter表达式 File file = new File(“/home/text/xyz.txt”); file.list(new FilenameFilter() { @Override public boolean accept(File dir, String name) { name.endsWith(“.txt”); return false; } }); 并且未成功转换为此 file.list(new FilenameFilter () { (File a1, String a2) […]

具有多个语句的Java 8 Lambda Stream forEach

我还在学习Lambda,请原谅我如果我做错了什么 final Long tempId = 12345L; List updatedEntries = new LinkedList(); for (Entry entry : entryList) { entry.setTempId(tempId); updatedEntries.add(entityManager.update(entry, entry.getId())); } //entryList.stream().forEach(entry -> entry.setTempId(tempId)); 看起来像forEach只能用于一个语句。 它不会返回更新的流或函数以进一步处理。 我可能完全选择了错误的一个。 有人可以指导我如何有效地做到这一点? 还有一个问题, public void doSomething() throws Exception { for(Entry entry: entryList){ if(entry.getA() == null){ printA() throws Exception; } if(entry.getB() == null){ printB() throws Exception; } if(entry.getC() == null){ […]

用于function接口的Java 8 lambda模糊方法 – 目标类型

我有以下代码: public class LambdaTest1 { public static void method1(Predicate predicate){ System.out.println(“Inside Predicate”); } public static void method1(Function function){ System.out.println(“Inside Function”); } public static void main(String[] args) { method1((i) -> “Test”); } } 这给我一个错误信息 “方法method1(谓词)对于LambdaTest1类型是不明确的”。 我可以看到,对于Function和Consumerfunction接口,输入参数是Integer 。 但是对于Function ,返回类型是String 。 由于我的lambda调用具有返回值“Text” – 这应该调用我的Function函数接口而不是抛出此错误。 任何人都可以解释这种行为背后的原因吗? 另一个例子: public class LambdaTest1 { public static void method1(Consumer consumer){ System.out.println(“Inside Consumer”); […]

内部类的构造函数引用在运行时因VerifyError而失败

我正在使用lambda ctx -> new SpectatorSwitcher(ctx)为内部类构造函数创建供应商。 IntelliJ建议我将它改为SpectatorSwitcher::new 。 SpectatorSwitcher是我正在使用的类的非静态内部类。建议的代码编译得很好(使用maven)但我在执行时得到以下VerifyError: Exception in thread “main” java.lang.VerifyError: Bad type on operand stack Exception Details: Location: Test.lambda$runTest$8(LTest$Worker;)V @2: invokedynamic Reason: Type ‘Test$Worker’ (current frame, stack[1]) is not assignable to ‘Test’ Current Frame: bci: @2 flags: { } locals: { ‘Test$Worker’ } stack: { ‘Test$Worker’, ‘Test$Worker’ } Bytecode: 0000000: 2a2a ba00 […]