gpt4 book ai didi

java - 在流操作中使用方法引用和函数对象之间的区别?

转载 作者:行者123 更新时间:2023-12-02 13:41:37 25 4
gpt4 key购买 nike

使用 Java 8 流时,我经常发现需要重构多语句 lambda 表达式。我将用一个简单的例子来说明这一点。假设我已经开始编写这段代码:

Stream.of(1, 3).map(i -> {
if (i == 1) {
return "I";
} else if (i == 3) {
return "E";
}
return "";
}).forEach(System.out::println);

现在我不太喜欢 map 调用中的大 lambda 表达式。因此,我想从那里重构它。我看到两个选项,要么在我的类中创建一个 Function 实例:

private static Function<Integer, String> mapper = i -> {
if (i == 1) {
return "I";
} else if (i == 3) {
return "E";
}
return "";
};

并像这样使用它:

Stream.of(1, 3).map(mapper).forEach(System.out::println);

或者我只是做一个方法:

private static String map(Integer i) {
if (i == 1) {
return "I";
} else if (i == 3) {
return "E";
}
return "";
}

并使用方法引用:

Stream.of(1, 3).map(Test::map).forEach(System.out::println);

除了明显的品味问题之外,这两种方法还有什么优点或缺点吗?

例如,我知道堆栈跟踪在方法引用情况下变得更具可读性,这是一个小优势。

最佳答案

除非有一些我不知道的额外魔法,否则当前的 lambda 实现会将非捕获 lambda 脱糖为静态方法,并缓存 lambda 实例。通过显式地执行相同的操作(对 lambda 的静态最终引用),您基本上是在重复该隐式工作,因此最终会得到对同一事物的两个缓存引用。您还击败了 lambda 实例的延迟初始化,否则您将免费获得该实例。

这就是为什么我更喜欢方法引用:它编写起来更简单,更惯用,而且在实现方面似乎更轻量级。

关于java - 在流操作中使用方法引用和函数对象之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32310324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com