java 函数式编程
程序员文章站
2022-06-07 12:12:22
...
首先得承认这篇文章有点标题党的味道,哈哈,到java6为止,java是不支持函数式编程的。前几天在使用apache commons collections的时候偶然发现CollectionUtils.exist方法,该方法用于判断集合中是否存在满足某个条件的元素,具体使用如下:
exists的第一个参数为接口Collection,第二个参数为接口Predicate,用来表示判断是否存在的条件,上例在调用的时候新建了一个匿名类。也正是匿名类的存在让整个代码显得繁琐不直观,说真的还不如自己动手写一个exists方法:
今年oracle在openjdk项目发布了[url="http://www.infoq.com/news/2010/06/lambda-syntax-debate"]java lambda[/url]的草案,如果将来commons collections也推出一个lambda版本,那么对exists的调用会变成:
尽管还不算完美,但至少比目前的exists方法调用简洁多了。CollectionUtils里面还存在collect, find, filter, select等函数式编程常用的方法,有兴趣的朋友可以看看。
@Test
public void test_functional_programming(){
String[] langs = {"java", "python", "c"};
assertTrue(
CollectionUtils.exists(Arrays.asList(langs), new Predicate() {
public boolean evaluate(Object object) {
return "java".equals((String)object);
}
})
);
}
exists的第一个参数为接口Collection,第二个参数为接口Predicate,用来表示判断是否存在的条件,上例在调用的时候新建了一个匿名类。也正是匿名类的存在让整个代码显得繁琐不直观,说真的还不如自己动手写一个exists方法:
private boolean existsJava(Collection<String> langs){
for (String lang : langs){
if ("java".equals(lang)) return true;
}
return false;
}
今年oracle在openjdk项目发布了[url="http://www.infoq.com/news/2010/06/lambda-syntax-debate"]java lambda[/url]的草案,如果将来commons collections也推出一个lambda版本,那么对exists的调用会变成:
CollectionUtils.exists(Arrays.asList(langs), #(String lang)("java".equals(lang)))
尽管还不算完美,但至少比目前的exists方法调用简洁多了。CollectionUtils里面还存在collect, find, filter, select等函数式编程常用的方法,有兴趣的朋友可以看看。
上一篇: java8 Optional源码
下一篇: Java实现输入年份,输出对应的生肖年