java-8 - 如何将带有谓词接口(interface)的通用列表转换为 Lambda 表达式?

标签 java-8 predicate

我正在学习 Java 8 函数式接口(interface),并正在尝试一些示例。 我正在尝试创建一种方法,该方法将接受通用列表作为一个参数,并接受字符串数据过滤器参数作为另一个参数。 下面的代码按预期工作,但是当我尝试将谓词转换为 Lambda 表达式时,我感到很挣扎。

@SuppressWarnings("unchecked")
public static <T> List<T> filter_and_find_only_selected_Data1(List<T> genericList, String dataFilter){
    Stream<List<T>> list = genericList.stream().map(eachListObj-> {
            if(eachListObj instanceof Employee){
                return genericList.stream().filter((Predicate<? super T>) new Predicate<Employee>() {
                    public boolean test(Employee eachEmpObj) {
                        return eachEmpObj.getEmpDept().equalsIgnoreCase(dataFilter);
                    }
                }).collect(Collectors.toList());
            }else if(eachListObj instanceof Customer){
                return genericList.stream().filter((Predicate<? super T>) new Predicate<Customer>(){
                    public boolean test(Customer eachCust) {
                        return !eachCust.getCustomerName().equalsIgnoreCase(dataFilter);
                    }
                }).collect(Collectors.toList());
            }
            return null;
    });
    return list.findAny().get();
}

有没有什么办法,我可以将谓词转换为 Lambda,以及如果有办法,我可以将 if-else-if 转换为三元运算符。 如:(if条件)?返回值:(else-if条件):返回值:null;

最佳答案

我想,你实际上想要这样的东西:

public static <T> List<T> filter_and_find_only_selected_Data(
    List<T> list, Function<? super T, String> stringProperty, String filterValue) {

    return list.stream()
        .filter(t -> filterValue.equalsIgnoreCase(stringProperty.apply(t)))
        .collect(Collectors.toList());
}

然后,调用者可以使用

List<Employee> source = …;
List<Employee> filtered
    = filter_and_find_only_selected_Data(source, Employee::getEmpDept, "value");

List<Customer> source = …;
List<Customer> filtered
    = filter_and_find_only_selected_Data(source, Customer::getCustomerName, "Bob");

List<File> source = Arrays.asList(new File("foo", "bar"), new File("foo", "test"),
    new File("xyz"), new File("TEST"), new File("abc", "bar"), new File("bla", "Test"));
List<File> filtered = filter_and_find_only_selected_Data(source, File::getName, "test");

展示真正通用方法的灵活性。

关于java-8 - 如何将带有谓词接口(interface)的通用列表转换为 Lambda 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61998261/

相关文章:

java - 如何使用 Java 流按会计年度对项目进行分组

java - 同一应用程序在两台不同的机器上显示不同的行为 jboss EAP 7.0

Java 8 关于实例创建的注释

R - 计算每列中某些值的数量

java - 按钮单击调用不带参数的面板方法

java - 在 Java 8 中使用函数式接口(interface)作为 filter() 函数的参数

lambda - 在 prolog 中的谓词内定义谓词

java - 该语句中的第一个 <U> 是什么意思?

java - 删除那些属性不在 commons-collections 集合中的属性

xcode - FilteredArrayUsingPredicate 上的 sigabrt