java8中新增的lambda和C#中的仍是比較類似的,下面用幾個例子來比較一下兩方經常使用的一些方法做爲比較便於記憶。咱們用一個List來作比較:java
var list = new ArrayList<Person>(); list.add(new Person("張三", 21)); list.add(new Person("李四", 22)); list.add(new Person("王五", 22)); list.add(new Person("趙六", 24));
1.Consumer<T> 和 Action<T>app
Consumer和Action均表示一個無返回值的委託。C#中lambda表示的是委託鏈,因此咱們能夠像操做委託同樣直接用+= -= 來操做整個lambda表達式樹。在java中不支持相似的寫法,因此Consumer有兩個方法:appect(T) andThen(Comsumer<? super T>),appect表示執行,andThen表示把參數內的lambda加入到stream流中。
spa
list.stream().forEach(p -> System.out.println(p.getName())); Consumer<Person> action = p -> System.out.println("action" + p.getName()); list.stream().forEach(action);
list.ForEach(p => Console.WriteLine(p.Name)); Action<Person> action = p => Console.WriteLine(p.Name); list.ForEach(action);
2.Predicate 和 Func<T,bool>對象
predicate相似func<T .. ,bool>,返回值是bool的委託。不一樣的是Predicate提供了幾個默認的實現:test() and() negate() or() equals(),都是一些邏輯判斷。blog
list.stream().filter(p -> p.getAge().intValue() > 21).forEach(p -> System.out.println(p.getName())); list.stream().filter(myPredicate(22)).map(p -> p.getName()).forEach(System.out::printIn); public static Predicate<Person> myPredicate(int value) { return p -> p.getAge().intValue() > value; }
list.Where(p => p.Age > 22).Select(p => p.Name).ToList();
3.Supplier接口
supplier,這個比較特殊,有點相似於IQueryable接口,懶加載,只有在get(java)/AsEnumerable(C#)/ToList(C#)的時候纔會真正建立這個對象。get
4.Function和Funcit
Function就和Func同樣,傳入參數,獲取返回值。Function也有三個默認的方法:appect andThen compose,andThen拼接到當前表達式後,compose拼接到當前表達式前。io