我开始熟悉Java了,有些特性我非常喜欢,例如在.filter()中使用Predicate,与.map()一起使用Function。这是一种非常好的功能方法。关于这个代码,我有三个问题:
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import java.util.function.Predicate;
public class ProcessList {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 4, 3, 2, 14, 1, -1, 0, 1, 5, 9, 0, 1);
Predicate<Integer> gt3 = (n) -> n > 3;
Function<Integer, Integer> plus11 = (n) -> n + 11;
List<Integer> numbersProcessed = numbers
.stream()
.filter(gt3)
.map(plus11)
.toList();
}
}Predicate:目前,数字3是硬编码的。假设我想要一个在运行时创建的动态谓词,例如(n) -> n > x,其中x是一些整数。如何创建动态谓词对象?我用new Predicate()尝试了一些东西,但这似乎不对。Function:假设我不想要加11,但是需要(n) -> n + x,x是在运行时提供的一些整数。如何创建动态函数对象?.filter()、.map()和.toList()操作让我想到: Java在设计上不是一种函数式语言。由于函数语言的本质是始终操纵列表,因此这些语言被优化以不断从现有的列表中生成新的列表,因此函数语言原则上不允许对对象进行就地操作。我想知道:比如说,有一个大清单,里面有数百万件物品。这类列表操作会对Java的性能产生重大影响吗?本质上:在Java中使用功能方法的成本是多少?非常感谢,祝您今天愉快。
发布于 2021-09-05 11:27:55
您可以创建如下方法:
Predicate<Integer> gt(Integer number) {
return (n) -> n > number;
}并使用Map<Integer, Predicate<Integer>>存储这些值。您可以实现这样的getter:
Predicate<Integer> getGt(Map<Integer, Predicate<Integer>> gtMap, Integer key) {
if (!gtMap.containsKey(key)) gtMap.put(key, gt(key));
return gtMap.get(key);
}至于第三个问题,我建议做一些实验,并阅读一些关于它的文章。
https://stackoverflow.com/questions/69062714
复制相似问题