Tag: lambda

我应该如何在我的用例中使用LambdaMetaFactory?

尽管已经阅读了我所知道的所有文档,但我无法解决使用lambdas执行方法的问题。 为了给出一些背景知识,我的用例是一个插件系统。 我正在使用可以分配给任何方法的注释(@EventHandle)。 我使用reflection并遍历类中的每个方法并检查它是否具有注释,如果是,则将方法添加到处理程序对象(将其添加到列表以处理每个“tick”)。 这是我的处理程序类: package me.b3nw.dev.Events; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import java.lang.invoke.*; import java.lang.reflect.Method; import java.lang.reflect.Type; @Slf4j public class Handler { @Getter private final Method method; @Getter private final EventHandle handle; private final MethodHandles.Lookup lookup; private final MethodHandle methodHandle; private final EventHandler invoker; public Handler(Method method, EventHandle handle) throws Throwable { this.method = method; […]

序列化的lambda和没有serialVersionUID?

我正在尝试学习序列化如何与Java及其最新版本一起工作。 我正在尝试序列化这样的lambda: Runnable r = (Runnable & Serializable)() -> {System.out.println(“This is a test”);}; 但我注意到我没有关于缺少serialVersionUID变量的警告。 这是正常的吗? 我知道它将在运行时生成,但强烈建议您定义它: https : //docs.oracle.com/javase/8/docs/api/java/io/Serializable.html 如果可序列化类未显式声明serialVersionUID,则序列化运行时将基于类的各个方面计算该类的默认serialVersionUID值,如Java(TM)对象序列化规范中所述。 但是,强烈建议所有可序列化类显式声明serialVersionUID值,因为默认的serialVersionUID计算对类详细信息高度敏感,这些详细信息可能因编译器实现而异,因此在反序列化期间可能会导致意外的InvalidClassExceptions。 因此,为了保证跨不同java编译器实现的一致serialVersionUID值,可序列化类必须声明显式serialVersionUID值。 强烈建议显式serialVersionUID声明尽可能使用private修饰符,因为此类声明仅适用于立即声明的类 – serialVersionUID字段不适用于inheritance成员。 数组类不能声明显式的serialVersionUID,因此它们始终具有默认的计算值,但是对于数组类,不需要匹配serialVersionUID值。 我该怎么办 ? 如何在Lambda中定义它? 谢谢

Java 8:如何使用lambda将列表转换为列表

我正在尝试将列表拆分为列表,其中每个列表的最大大小为4。 我想知道如何使用lambdas做到这一点。 目前我正在这样做的方式如下: List<List> listOfList = new ArrayList(); final int MAX_ROW_LENGTH = 4; int startIndex =0; while(startIndex <= listToSplit.size() ) { int endIndex = ( ( startIndex+MAX_ROW_LENGTH ) < listToSplit.size() ) ? startIndex+MAX_ROW_LENGTH : listToSplit.size(); listOfList.add(new ArrayList(listToSplit.subList(startIndex, endIndex))); startIndex = startIndex+MAX_ROW_LENGTH; } UPDATE 似乎没有一种简单的方法可以使用lambdas来拆分列表。 虽然所有答案都非常受欢迎,但它们也是lambdas不简化事物的一个很好的例子。

javac生成的$$中的$$是什么意思?

当转移由DependencyFinder和java-callgraph等库生成的java调用图时,我发现java编译器为匿名函数,内部类等生成名称。 我已经发现了其中几个的含义(如果我错了,请更正): org.example.Bar$Foo引用Foo ,它是org.example.Bar的内部类。 org.example.Bar$1引用在org.example.Bar$1一个方法中声明的匿名类。 org.example.Bar.lambda$spam$1()是指在org.example.Bar.spam()方法中声明的lambda。 但是,我还发现: org.example.Bar$$Lambda$2.args$1 org.example.Bar$$Lambda$2.call() org.example.Bar$$Lambda$7.lambdaFactory$() org.example.Bar$$Lambda$7.get$Lambda() 上面的四个名字是指什么? 双美元( $$ )是什么意思?

使用IDE支持,使Intellij IDEA允许在java 5 6 7语言级别使用lambda

因为retrolambda ,我们可以在java 5 6 7中使用java 8 lambda特性。那么,如何让Intellij Idea在java 5 6 7语言级别允许lambda,还有lambda的ide特性?

Lambda Metafactory变量捕获

使用MethodHandles.Lookup , MethodHandle , MethodType等手动创建lambda时,如何实现变量捕获? 例如,没有捕获: public IntSupplier foo() { return this::fortyTwo; } /** * Would not normally be virtual, but oh well. */ public int fortyTwo() { return 42; } 和它的笨重forms,使用java.lang.invoke东西: public IntSupplier foo() { MethodHandles.Lookup lookup = MethodHandles.lookup(); MethodType methodType = MethodType.methodType(int.class), lambdaType = MethodType.methodType(IntSupplier.class); MethodHandle methodHandle = lookup.findVirtual(getClass(), “fortyTwo”, methodType); CallSite callSite […]

为什么在捕获静态字段值时,等效的lambda表达式和方法引用的行为会有所不同?

我对Java lambdas和方法引用行为有点困惑。 例如,我们有这个代码: import java.util.function.Consumer; public class Main { private static StringBuilder sBuilder = new StringBuilder(“1”); public static void main(String[] args) { Consumer consumer = s -> sBuilder.append(s); sBuilder = new StringBuilder(“2”); consumer.accept(“3”); System.out.println(sBuilder); } } 输出: 23 这可以按预期工作,但如果我们更换 s – > sBuilder.append(s) 同 sBuilder ::追加 输出将是: 2 你有什么想法解释这个吗? 这不是一回事吗? 谢谢。

Java 8流运行速度比for循环慢的关键指标?

在大多数情况下,Java 8流允许的代码比旧式for循环更具可读性。 但是,根据我自己的经验和我所读到的内容,使用流而不是for循环可能会导致性能损失(或偶尔会有改进),有时难以预测。 在一个大型项目中,为每个循环编写基准测试似乎不太可行,因此在决定是否用流替换for循环时,关键因素是什么 (例如,预期的集合大小,删除的值的预期百分比通过过滤,迭代操作的复杂性,减少或聚合的类型等,它们可能表明将导致的性能变化? 注意:这是我之前的问题的缩小,因为过于宽泛而关闭(并且并行流的方面在另一个SO问题中得到了很好的覆盖),所以让我们将其限制为顺序流。

如何使用Lambda Expression获得单词平均长度

我有一个单词列表文本文件,我想从该文件中获取最小,最大和平均单词长度。 我有一个流方法: public static Stream readWords(String filename) { try { BufferedReader reader = new BufferedReader(new FileReader(filename)); Stream stringStream = reader.lines(); return stringStream; } catch (IOException exn) { return Stream.empty(); } } 在我的主要测试方法中,我打印最大和最小 System.out.println(readWords(filename) .min(Comparator.comparing(s -> s.length())) .get() .length() ); System.out.println(readWords(filename) .max(Comparator.comparing(s -> s.length())) .get() .length() ); 它按预期工作。 问题: 是否有可能像我在min和max中那样得到单词长度的平均值? 在是或否的情况下,如何做到这一点(仅作为Lambda表达式)?

java-8过滤列表而不创建新列表

我正在寻找一种最简单的方法来过滤Java-8中的列表,使用简单的lambda Predicate , 而无需创建新列表 。 特别是,这个解决方案不合适,因为toList()返回一个新的List : List beerDrinkers = persons.stream() .filter(p -> p.getAge() > 16) .collect(Collectors.toList()); 请注意,以下解决方案也不起作用,因为列表应该是原始值的clear() ed(但很明显,如果在过滤之前清除它,则没有任何内容可以过滤…): persons.stream() .filter(p -> p.getAge() > 16) .forEach((p) -> persons.add(p)); (另外,我更喜欢不涉及使用第三方库或框架的解决方案)