动态谓词和函数以及函数方法的成本



我开始熟悉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();
}
}
  1. 关于Predicate:目前3是硬编码的。假设我想要一个动态谓词,它是在运行时创建的,例如(n) -> n > x,x是一些整数。如何创建动态谓词对象?我尝试了一些使用new Predicate(),但这似乎不正确。

  2. 同1。关于Function:说我不想加11,但(n) -> n + x,x是运行时提供的一些整数。我如何创建一个动态的函数对象?

  3. .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);
}

关于第三个问题,我建议做一些实验,读一些相关的文章。

相关内容

  • 没有找到相关文章

最新更新