gpt4 book ai didi

java-8 - JAVA 8 将谓词提取为字段或方法?

转载 作者:行者123 更新时间:2023-12-02 20:53:30 24 4
gpt4 key购买 nike

提取具有多种用途的谓词的更简洁的方法是什么。方法还是类字段?

两个例子:

1.类字段

void someMethod() {
IntStream.range(1, 100)
.filter(isOverFifty)
.forEach(System.out::println);
}

private IntPredicate isOverFifty = number -> number > 50;

2.方法

void someMethod() {
IntStream.range(1, 100)
.filter(isOverFifty())
.forEach(System.out::println);
}

private IntPredicate isOverFifty() {
return number -> number > 50;
}

对我来说,田野方式看起来更好一点,但这是正确的方式吗?我有疑问。

最佳答案

通常您会缓存创建成本高昂的内容,而这些无状态 lambda则不会。无状态 lambda 将为整个管道(在当前实现下)创建一个实例。第一次调用是最昂贵的 - 将创建并链接底层 Predicate 实现类;但对于无状态和有状态 lambda 来说,这种情况只发生一次。

有状态的 lambda 将为每个元素使用不同的实例,并且缓存这些实例可能有意义,但您的示例是无状态的,所以我不会。

如果您仍然想要这样做(我假设是出于阅读目的),我会在类 Predicates 中进行假设。它也可以在不同的类之间重用,如下所示:

 public final class Predicates {
private Predicates(){
}

public static IntPredicate isOverFifty() {
return number -> number > 50;
}
}

您还应该注意到,在 Stream 中使用 Predicates.isOverFiftyx -> x > 50 虽然语义相同,但内存使用情况不同。

在第一种情况下,只会创建一个实例(和类)并将其提供给所有客户端;而第二个 (x -> x > 50) 不仅会创建一个不同的实例,还会为其每个客户端创建一个不同的类(想象一下在应用程序内的不同位置使用相同的表达式)。发生这种情况是因为链接发生在每个 CallSite 上 - 而在第二种情况下,CallSite 始终不同。

但这是你不应该依赖的东西(甚至可能考虑) - 这些对象和类可以快速构建并通过 GC 快速删除 - 无论什么适合你的需求 - 使用它。

关于java-8 - JAVA 8 将谓词提取为字段或方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45619125/

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