我开始熟悉Java,并且有一些我非常喜欢的功能,例如使用Predicate
与.filter()
和Function
与.map()
。这是一个很好的函数式方法。关于这段代码,我有三个问题:
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()
,但这似乎不正确。同1。关于
Function
:说我不想加11
,但(n) -> n + x
,x
是运行时提供的一些整数。我如何创建一个动态的函数对象?.filter()
,.map()
和.toList()
操作让我认为:Java不是一个设计的函数式语言。由于函数式语言的本质是一直操作列表,因此这些语言被优化为不断地从现有列表中生成新列表,而且函数式语言原则上不允许对对象进行就地操作。我在想:假设有一个很大的列表,包含数百万个项目。这些类型的列表操作会对Java的性能产生重大影响吗?本质上:在Java中使用函数式方法的代价是什么?
非常感谢您,祝您愉快。
你可以创建一个这样的方法:
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);
}
关于第三个问题,我建议做一些实验,读一些相关的文章。