有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

函数式编程Java中是否有类似于grep()的过滤方法?

我正在编写一个小应用程序,它需要在许多不同的列表上执行一项常见任务:根据给定的条件过滤对象

例如,类Foo的ArrayList具有属性int barboolean baz

class Foo {
    int bar;
    boolean baz;
}

我想从该ArrayList中检索一个新列表,其中只包含符合给定条件(例如bar > 1)的对象。在Perl等其他语言中,我只需使用grep()来获取所有这些对象:

@where_bar_greater_one = grep { $_->{bar} > 1 } @list;

但使用Java似乎并不那么容易。现在,我用一个静态方法模拟了这种行为,该方法使用一个匿名内部类迭代所有元素:

interface ListPredicate<T> {
    boolean match(T item);
}

class ListUtil {
    public static <T> List<T> grep(List<T> source, ListPredicate<T> predicate) {
        ArrayList<T> results = new ArrayList<T>();
        for(T item : source) {
            if(predicate.match(item)) results.add(item);
        }
        return results;
    }
}

ArrayList<Foo> found = new ArrayList<Foo>(ListUtil.grep(list, new ListPredicate<Foo>() {
    @Override public boolean match(Foo item) {
        return item.bar > 1 ? true : false;
    }
}));

与一小段Perl代码相比,这段代码看起来有些臃肿,我想知道我是否错过了什么。这给我留下了两个问题:

  1. 有没有一种不使用任何外部库就能做到这一点的更短(甚至更干净)的方法
  2. 有没有推荐的开源库为这种常见的高阶函数(比如grepfoldLeftreduceLeftmap等等)提供方法

共 (2) 个答案

  1. # 1 楼答案

    或者你可以用grep4j表示java greps。(也适用于远程文件)