方法参考与 lambda 表达式
method reference vs lambda expression
我想在下面的示例中用方法引用替换 lambda 表达式:
public class Example {
public static void main(String[] args) {
List<String> words = Arrays.asList("toto.", "titi.", "other");
//lambda expression in the filter (predicate)
words.stream().filter(s -> s.endsWith(".")).forEach(System.out::println);
}
}
我想写这样的东西:
words.stream().filter(s::endsWith(".")).forEach(System.out::println);
是否可以将任何 lambda 表达式转换为方法引用。
没有办法“将任何 lambda 表达式转换为方法引用”,但您可以为特定目标类型实现工厂,如果这满足重复需要:
public static <A,B> Predicate<A> bind2nd(BiPredicate<A,B> p, B b) {
return a -> p.test(a, b);
}
有了这个,你就可以写
words.stream().filter(bind2nd(String::endsWith, ".")).forEach(System.out::println);
但实际上,没有任何优势。从技术上讲,lambda 表达式完全符合您的要求,有最少的必要参数转换代码,表示为 lambda 表达式的主体,编译成合成方法和对该合成代码的方法引用。语法
s -> s.endsWith(".")
也已经是表达该意图的最小语法。我怀疑您能否找到一个更小的结构,它仍然与 Java 编程语言的其余部分兼容。
您可以使用 Eclipse Collections. selectWith()
takes a Predicate2 中的 selectWith()
,它采用 2 个参数而不是 Predicate
。 selectWith()
的第二个参数在每次调用时作为第二个参数传递给 Predicate2
,可迭代对象中的每个项目一次。
MutableList<String> words = Lists.mutable.with("toto.", "titi.", "other");
words.selectWith(String::endsWith, ".").each(System.out::println);
默认情况下 Eclipse Collections 是急切的,如果你想延迟迭代那么你可以使用 asLazy()
words.asLazy().selectWith(String::endsWith, ".").each(System.out::println);
如果你不能从List
改变:
List<String> words = Arrays.asList("toto.", "titi.", "other");
ListAdapter.adapt(words).selectWith(String::endsWith, ".").each(System.out::println);
Eclipse Collections 的 RichIterable 还有其他几个 *With 方法可以很好地与方法引用配合使用,包括 rejectWith()
、partitionWith()
、detechWith()
、anySatisfyWith()
, allSatisfyWith()
, noneSatisfyWith()
, collectWith()
注意:我是 Eclipse Collections 的贡献者。
我想在下面的示例中用方法引用替换 lambda 表达式:
public class Example {
public static void main(String[] args) {
List<String> words = Arrays.asList("toto.", "titi.", "other");
//lambda expression in the filter (predicate)
words.stream().filter(s -> s.endsWith(".")).forEach(System.out::println);
}
}
我想写这样的东西:
words.stream().filter(s::endsWith(".")).forEach(System.out::println);
是否可以将任何 lambda 表达式转换为方法引用。
没有办法“将任何 lambda 表达式转换为方法引用”,但您可以为特定目标类型实现工厂,如果这满足重复需要:
public static <A,B> Predicate<A> bind2nd(BiPredicate<A,B> p, B b) {
return a -> p.test(a, b);
}
有了这个,你就可以写
words.stream().filter(bind2nd(String::endsWith, ".")).forEach(System.out::println);
但实际上,没有任何优势。从技术上讲,lambda 表达式完全符合您的要求,有最少的必要参数转换代码,表示为 lambda 表达式的主体,编译成合成方法和对该合成代码的方法引用。语法
s -> s.endsWith(".")
也已经是表达该意图的最小语法。我怀疑您能否找到一个更小的结构,它仍然与 Java 编程语言的其余部分兼容。
您可以使用 Eclipse Collections. selectWith()
takes a Predicate2 中的 selectWith()
,它采用 2 个参数而不是 Predicate
。 selectWith()
的第二个参数在每次调用时作为第二个参数传递给 Predicate2
,可迭代对象中的每个项目一次。
MutableList<String> words = Lists.mutable.with("toto.", "titi.", "other");
words.selectWith(String::endsWith, ".").each(System.out::println);
默认情况下 Eclipse Collections 是急切的,如果你想延迟迭代那么你可以使用 asLazy()
words.asLazy().selectWith(String::endsWith, ".").each(System.out::println);
如果你不能从List
改变:
List<String> words = Arrays.asList("toto.", "titi.", "other");
ListAdapter.adapt(words).selectWith(String::endsWith, ".").each(System.out::println);
Eclipse Collections 的 RichIterable 还有其他几个 *With 方法可以很好地与方法引用配合使用,包括 rejectWith()
、partitionWith()
、detechWith()
、anySatisfyWith()
, allSatisfyWith()
, noneSatisfyWith()
, collectWith()
注意:我是 Eclipse Collections 的贡献者。