在对象集合中查找
最近写代码时经常遇到在一个Collection中找某个符合条件的元素。比如我要“在这些书中找到《编程之魂》”,这个简单算法在Java中得这么写:
private static Book getBookByName(List<Book> all, String bookName){ for ( Book b : all) { String bName = b.getName(); if ( bName.equals(bookName) ){ return b; } } }
大段的代码会打断工作的“流”:你不得不停下刚才的想法而先完成这个任务,这势必会影响效率。.NET中有个先进的玩意LINQ,用类似SQL的语法来操作collectio而不是常见的关系数据库。有了SQL语法,当然可以生成比上面复杂多的查询条件。Java开发人员只能羡慕了:在函数式编程方面,C#走在了Java前面。
Javascript中也有同样的问题,看了下jQuery,它有个方法jQuery.grep:
var arr = [ 1, 9, 3, 8, 6, 1, 5, 9, 4, 7, 3, 8, 6, 9, 1 ]; arr = jQuery.grep(arr, function(n, i){ return (n != 5 && i > 4); }); // return 1, 9, 4, 7, 3, 8, 6, 9, 1
闭包的优势就体现出来了。而Java没有闭包,所以得整匿名函数。Google Guava扩展了JDK引以为豪的Java Collection框架(看看Guava的其他扩展,Java老矣),其中有个方法Iterables.filter(Iterable