gpt4 book ai didi

java - 编写一个 Java 8 谓词来过滤不在范围内的值

转载 作者:行者123 更新时间:2023-12-01 23:03:18 25 4
gpt4 key购买 nike

我正在尝试编写一个过滤谓词,该谓词将根据保存在不同对象中的值过滤列表,但我想要提取值进行比较的对象在执行比较时可用,不是在定义谓词时。

这是一个SSCCE

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
public class StreamTest {
public static void main(String [] args){
DataContainer dc = new DataContainer();
Predicate<Integer> p = new Predicate<Integer>(){
@Override
public boolean test(Integer t) {
/********************************************/
return t > 6; // I need this to be t > the limitValue that is available when the predicate gets executed
/********************************************/
}
};

System.out.println(dc.numberOfValuesGreaterThan(p, new LimitValue(6)));
}

}
class DataContainer{
private List<Integer> l = Arrays.asList(new Integer[]{1,2,3,4,5,6,7,8,9,10});

public long numberOfValuesSatisfyingPredicate(Predicate predicate,LimitValue lv){
return l.stream()
.filter(predicate)
.count();
}
}
class LimitValue{
private int limitValue;
public LimitValue(int limitValue){
this.limitValue = limitValue;
}
public int getValue(){
return limitValue;
}
}

该代码创建了一个 DataContainer,其中包含数字 1 - 10 并具有一个采用谓词和限制值的方法,允许您执行诸如获取大于 5 或​​小于 9 的元素数之类的操作,方法是提供不同的谓词。

但是,在定义 Predicate 时,LimitValue 对象不在范围内。是否可以定义一个 Predicate 来访问在执行时可用但在定义时不可用的变量?

最佳答案

虽然函数像其他答案一样会提供通用解决方案。 Java 8 有一个内置的 BiPredicate(以及 BiFunction、BiConsumer、BiSupplier 等)接口(interface),您可以改用它。这里是所有内置的功能接口(interface)。 https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html

柯里化(Currying)基本上是将具有多个输入的功能接口(interface)转换为采用单个输入的一系列功能。以下是柯里化(Currying)的其他示例 https://gist.github.com/timyates/7674005

注意函数式接口(interface)旨在成为 lambda;没必要写这么大声的匿名类。 Arrays.asList 不需要数组,只需要元素。还建议在处理基元时使用像 IntStream 这样的基元流和数组。这可能会对性能产生重大影响,现在养成习惯是个好主意。 C# 没有这样的区别,但 Java 是按原始/数组和对象/集合类型划分的。基本上使用最适合工作的流类型和功能接口(interface),代码的意图会更清晰。

public class StreamTest {
public static void main(String[] args) {
DataContainer dc = new DataContainer();
BiPredicate<Integer, LimitValue> p = (t, limitValue) -> t > limitValue.getValue();
System.out.println(dc.numberOfValuesGreaterThan(p, new LimitValue(6)));
}

}

class DataContainer {
private int[] l = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

long numberOfValuesGreaterThan(BiPredicate<Integer, LimitValue> predicate, LimitValue lv) {
return IntStream.of(l)
.filter(t -> predicate.test(t, lv))
.count();
}
}

class LimitValue {
private int limitValue;

LimitValue(int limitValue) {
this.limitValue = limitValue;
}

int getValue() {
return limitValue;
}
}

关于java - 编写一个 Java 8 谓词来过滤不在范围内的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44314740/

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