Lambda表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能。
它的基本用法如下:
(parameters) -> expression
或
(parameters) ->{ statements; }
lambda通常和stream一起使用, 使用lambda可以支持许多操作,如 map, filter, limit, sorted, count, min, max, sum, collect 等等。
下面来看具体的代码:
/**
*
* @version V1.0
* @Title: lambda
* @Package com.ly
* @Description: 学习lambda表达式的使用
* @author: HappyLiu
* @date: 2019/2/18
*/
public class Lambda {
public static void main(String[] args) {
// String[] player = {"marin","blank","faker",""};
List<Player> list = new ArrayList<>();
list.add(new Player("marin",20));
list.add(new Player("blank",30));
list.add(new Player("faker",40));
list.add(new Player("bang",50));
list.add(new Player("wolf",60));
//传统用匿名内部类的方法
Collections.sort(list, new Comparator<Player>() {
@Override
public int compare(Player player1, Player player2) {
return player1.getAge()-player2.getAge();
}
});
for (Player player :list){
System.out.println("SKT队员:"+player);
}
//用lambda表达式
Comparator<Player> comparatorByAge =(Player player1,Player player2) -> (player2.getAge()-player1.getAge());
Collections.sort(list,comparatorByAge);
// Arrays.sort(list,comparatorByAge);
// Arrays.sort(list,(Player player1,Player player2) -> (player2.getAge()-player1.getAge()));
list.forEach((player -> System.out.println("用lambda输出:"+player)));
list.forEach(System.out::println);
//用forEach把所有队员的年龄加1
Consumer<Player> giveRaise = e -> e.setAge(e.getAge()+1);
list.forEach(giveRaise);
//用filter筛选
list.stream()
.filter(player -> (player.getAge()>30))
.forEach(player -> System.out.println("用filter筛选"+player) );
//定义filter
Predicate<Player> ageFilter = e -> e.getAge()>40;
Predicate<Player> nameFilter = e ->e.getName().equalsIgnoreCase("Faker");
list.stream()
.filter(ageFilter)
.filter(nameFilter)
.forEach(player -> System.out.println("定义filter"+player));
//使用limit限制结果集的个数
list.stream()
.limit(3)
.forEach(player -> System.out.println("使用limit限制"+player));
//使用stream的sorted方法排序
List<Player> sortedPlayer =list
.stream()
.sorted((p1,p2) -> (p1.getName().compareTo(p2.getName())))
.collect(Collectors.toList());
sortedPlayer.forEach(player -> System.out.println("sorted排序后:"+player));
//使用min获取年龄最小的
Player minAgePlayer = list
.stream()
.min((p1,p2) -> (p1.getAge()-p2.getAge()))
.get();
System.out.println("年龄最小的队员是:"+minAgePlayer);
//使用map方法封装结果集
String playerName = list
.stream()
.map(Player::getName)
.collect(Collectors.joining(";"));
System.out.println("所有队员的名字:"+playerName);
//使用SummaryStatistics获得stream中元素的汇总数据
IntSummaryStatistics summaryStatistics = list
.stream()
.mapToInt(p -> p.getAge())
.summaryStatistics();
System.out.println("队员的平均年龄:"+summaryStatistics.getAverage());
System.out.println("队员的最大年龄:"+summaryStatistics.getMax());
System.out.println("队员的数量:"+summaryStatistics.getCount());
}