摘要: 1.Java8 新特性介绍 2.项目中应用

1.Java8 新特性介绍

原文链接 https://my.oschina.net/chenxiaobian/blog/704421,https://www.cnblogs.com/hmdrzql/p/6354010.html

现在我们有一个需求:给一个user组成的list 按照user的年龄排序。实现不难,代码如下:

UserCompare是一个实现了Comprator的类

这种方法由于sort方法的第二个参数是Comparator 所以你要写一个实现类(我这里是UserCompare类),并且override该接口的实现方法。

java8提供了lambda来简化,有了lambda程序员从此不加班呀~

刚才那个Comparator的实现类以及内部若干代码就都省了,代之以lambda表达式。

另外,IntelliJ会提示你改成更好的写法

实现类里有多少代码,你就省了多少行代码。

高兴了半天,到底是什么原理呢?其实是java8新提供的语法糖。

我们打开java1.8 Comparator的定义,发现了类定义上面多了一个@FunctionalInterface

对,1.8多了一个概念就是FunctionalInterface,这个Comparator就是一个FunctionalInterface

有了这个注解,原来使用实现类的地方就可以代之以lambda表达式。

写java的同学对java8肯定知道 那么java8到底有哪些特性呢,总结如下:

Lambda表达式函数式接口StreamOptionalPredicateFunctionConsumerFilterMap-Reduce新的Date API

最核心的当然是函数式编程了,写代码非常简单,请看下面详细例子介绍

2.Java8 lambda使用总结-结合实例介绍

很多同学一开始接触Java8可能对Java8 Lambda表达式有点陌生,下面我将结合实例介绍Java8的使用 并与Java7进行比较:

基础类

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Person {private int id;private String name;private String address;}

1.List操作

public class ExampleList {private static List<String> items = new ArrayList<>();static {items.add("A");items.add("BC");items.add("C");items.add("BD");items.add("E");}public static void main(String[] args) {//Java8之前操作Listfor(String item:items){System.out.println(item);}//Java8 lambda遍历listitems.forEach(c-> System.out.println(c));items.forEach(item->{if("C".equals(item)){System.out.println(item);}});System.out.println("--------");//先过滤items.stream().filter(s->s.contains("B")).forEach(c1-> System.out.println(c1));}
}

2.Map操作

public class ExampleMap {private static Map<String, Integer> items = new HashMap<>();static {items.put("A", 10);items.put("B", 20);items.put("C", 30);items.put("D", 40);items.put("E", 50);items.put("F", 60);}public static void main(String[] args) {//Java8之前遍历是这样遍历mapfor(Map.Entry<String,Integer> entry:items.entrySet()){System.out.println("key:" + entry.getKey() + " value:" + entry.getValue());}//Java8遍历mapitems.forEach((key,value)-> System.out.println("key:" + key + " value:" + value));}}

3.Groupingby操作

/*** *Java8 Collectors.groupingBy and Collectors.mapping example*/
public class ExampleMapping {private static List<Person> personList = Lists.newArrayList();static {personList.add(Person.builder().id(10).address("apple").address("shanghai").build());personList.add(Person.builder().id(12).address("apple").address("wuhan").build());personList.add(Person.builder().id(16).address("apple").address("nanjing").build());}public static void main(String[] args) {//分组Map<String, List<Person>> collect = personList.stream().collect(Collectors.groupingBy(c -> c.getAddress()));System.out.println(collect);}
}

4.List转换为Map

public class ExampleListConvertMap {private static List<Person> personList = Lists.newArrayList();static{personList.add(Person.builder().id(20).name("zhangsan").address("shanghai").build());personList.add(Person.builder().id(30).name("lisi").address("nanjing").build());}public static void main(String[] args) {//Java8 List转换MapMap<Integer,Person> map_ = personList.stream().collect(Collectors.toMap((key->key.getId()),(value->value)));map_.forEach((key,value)-> System.out.println(key + ":" + value));Map<Integer, Person> mappedMovies = personList.stream().collect(  Collectors.toMap(Person::getRank, Person::getData)); }
}

5.FilterMap操作

public class ExampleFilterMap {private static Map<Integer,String> map_ = Maps.newHashMap();static{map_.put(1, "linode.com");map_.put(2, "heroku.com");map_.put(3, "digitalocean.com");map_.put(4, "aws.amazon.com");}public static void main(String[] args) {//before java iterator mapString result = null;for(Map.Entry<Integer,String> entry:map_.entrySet()){if("heroku.com".equals(entry.getValue())){result = entry.getValue();}}System.out.println("Before Java 8 :" + result);//Java8 Map->Stream->Filter->Stringresult =  map_.entrySet().stream().filter(map->"heroku.com".equals(map.getValue())).map(map->map.getValue()).collect(Collectors.joining());System.out.println("Java 8 :" + result);Map<Integer,String> collect =  map_.entrySet().stream().filter(c->c.getKey()==2).collect(Collectors.toMap(p->p.getKey(),p->p.getValue()));System.out.println(collect);}
}

6.Optional操作可以防止NullPointException

Optional<String> optional = Optional.of("hello");
System.out.println(optional.isPresent());//true
System.out.println(optional.get());//hello
System.out.println(optional.orElse("false"));
optional.ifPresent((s)-> System.out.println(s.charAt(0)));//h

7.给出一个详细的例子

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Employee {private String name;private int salary;private String office;
}public class ExampleEmployee {private static List<Employee> employeeList = Lists.newArrayList();static{employeeList.add(Employee.builder().name("Matt").salary(5000).office("New York").build());employeeList.add(Employee.builder().name("Steve").salary(6000).office("London").build());employeeList.add(Employee.builder().name("Carrie").salary(20000).office("New York").build());employeeList.add(Employee.builder().name("Peter").salary(7000).office("New York").build());employeeList.add(Employee.builder().name("Pat").salary(8000).office("London").build());employeeList.add(Employee.builder().name("Tammy").salary(29000).office("Shanghai").build());}public static void main(String[] args) {//anyMatchboolean isMatch = employeeList.stream().anyMatch(employee -> employee.getOffice().equals("London"));System.out.println(isMatch);//返回所有salary大于6000boolean matched = employeeList.stream().allMatch(employee -> employee.getSalary()>4000);System.out.println(matched);//找出工资最高Optional<Employee> hightestSalary = employeeList.stream().max((e1,e2)->Integer.compare(e1.getSalary(),e2.getSalary()));System.out.println(hightestSalary);//返回姓名列表List<String> names = employeeList.stream().map(employee -> employee.getName()).collect(Collectors.toList());System.out.println(names);//List转换成MapMap<String,Employee> employeeMap = employeeList.stream().collect(Collectors.toMap((key->key.getName()),(value->value)));employeeMap.forEach((key,value)-> System.out.println(key + "=" + value));//统计办公室是New York的个数long officeCount = employeeList.stream().filter(employee -> employee.getOffice().equals("Shanghai")).count();System.out.println(officeCount);//List转换为SetSet<String> officeSet = employeeList.stream().map(employee -> employee.getOffice()).distinct().collect(Collectors.toSet());System.out.println(officeSet);//查找办公室地点是New York的员工Optional<Employee> allMatchedEmployees = employeeList.stream().filter(employee -> employee.getOffice().equals("New York")).findAny();System.out.println(allMatchedEmployees);//按照工资的降序来列出员工信息List<Employee> sortEmployeeList =  employeeList.stream().sorted((e1,e2)->Integer.compare(e2.getSalary(),e1.getSalary())).collect(Collectors.toList());//按照名字的升序列出员工信息List<Employee> sortEmployeeByName = employeeList.stream().sorted((e1,e2)->e1.getName().compareTo(e2.getName())).collect(Collectors.toList());System.out.println(sortEmployeeList);System.out.println("按照名字的升序列出员工信息:" + sortEmployeeByName);//获取工资最高的前2条员工信息List<Employee> top2EmployeeList= employeeList.stream().sorted((e1,e2)->Integer.compare(e2.getSalary(),e1.getSalary())).limit(2).collect(Collectors.toList());System.out.println(top2EmployeeList);//获取平均工资OptionalDouble averageSalary = employeeList.stream().mapToInt(employee->employee.getSalary()).average();System.out.println("平均工资:" + averageSalary);//查找New YorkOptionalDouble averageSalaryByOffice = employeeList.stream().filter(employee -> employee.getOffice().equals("New York")).mapToInt(employee->employee.getSalary()).average();System.out.println("New York办公室平均工资:" + averageSalaryByOffice);}
}

8.Java8常见操作


public class EmployeeTest {public static List<Employee> generateData() {return Arrays.asList(new Employee("Matt", 5000, "New York"),new Employee("Steve", 6000, "London"),new Employee("Carrie", 10000, "New York"),new Employee("Peter", 7000, "New York"),new Employee("Alec", 6000, "London"),new Employee("Sarah", 8000, "London"),new Employee("Rebecca", 4000, "New York"),new Employee("Pat", 20000, "New York"),new Employee("Tammy", 9000, "New York"),new Employee("Fred", 15000, "Tokyo"));}public static Map<String, Integer> generateMapData() {Map<String, Integer> items = Maps.newHashMap();items.put("A", 10);items.put("B", 20);items.put("C", 30);items.put("D", 40);items.put("E", 50);items.put("F", 60);return items;}@Testpublic void testEmployee() {List<Employee> results = generateData();//打印出名字是Steve的员工信息results.forEach(c -> {if (c.getName().equals("Steve")) {System.out.println(c);}});System.out.println("---------");//找出年薪超过6000的员工results.stream().filter(c -> c.getSalary() >= 60000).forEach(c -> System.out.println(c));System.out.println("--->>>>>>----");//java8遍历mapMap<String, Integer> map_ = generateMapData();map_.forEach((key, value) -> System.out.println("key:" + key + "," + "value:" + value));System.out.println("---->>>>分组>>>-----");//java8 分组操作Map<String, List<Employee>> groupMap = results.stream().collect(Collectors.groupingBy(c -> c.getOffice()));System.out.println(groupMap);System.out.println("---->>>>List转化为Map>>>----");//List转化MapMap<String, Object> map = results.stream().collect(Collectors.toMap(Employee::getName, Employee::getOffice));map.forEach((key, value) -> System.out.println("key:" + key + "," + "value:" + value));System.out.println("---->>>>>>>----");Map<Integer, Employee> employeeMap = results.stream().collect(Collectors.toMap((key -> key.getSalary()), (value -> value)));employeeMap.forEach((key, value) -> System.out.println(key + "," + value));System.out.println("---->>遍历map>>>----");//打印出值大于30的mapMap<String, Integer> resultMap = map_.entrySet().stream().filter(c -> c.getValue() > 30).collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));resultMap.forEach((key, value) -> System.out.println(key + "=" + value));System.out.println(">>>>>>>>>>>>>>>");//打印key=D的mapMap<String, Integer> mapResults = map_.entrySet().stream().filter(c -> c.getKey().equals("D")).collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));mapResults.forEach((key, value) -> System.out.println(key + ">>>>" + value));System.out.println(">>>>>>>Optional>>>>>>>");Optional<String> optional = Optional.of("hello");System.out.println(optional.isPresent());}@Testpublic void testEmployeeExample() {//anyMatchList<Employee> employeeList = generateData();boolean isMatch = employeeList.stream().anyMatch(employee -> employee.getOffice().equals("London"));System.out.println(isMatch);//allMatchboolean matched = employeeList.stream().allMatch(employee -> employee.getOffice().equals("London"));System.out.println(matched);//找出工资最高的Optional<Employee> employeeOptional = employeeList.stream().max((e1,e2)->Integer.compare(e1.getSalary(),e2.getSalary()));System.out.println(employeeOptional);//找出工资最少的Optional<Employee> employee = employeeList.stream().min((e1,e2)->Integer.compare(e1.getSalary(),e2.getSalary()));System.out.println(employee);//返回姓名列表List<String> names = employeeList.stream().map(c->c.getName()).collect(Collectors.toList());System.out.println(names);System.out.println(">>>>>>>>>>>");//List转化MapMap<String,Employee> employeeMap = employeeList.stream().collect(Collectors.toMap((key->key.getName()),(value->value)));employeeMap.forEach((key,value)-> System.out.println(key + "=" + value));//统计办公室是New York的个数long officeCount =  employeeList.stream().filter(c->c.getOffice().equals("New York")).count();System.out.println(officeCount);long salaryCount = employeeList.stream().filter(c->c.getSalary()>60000).count();System.out.println(salaryCount);//List转化为SetSet<String> officeSet = employeeList.stream().map(c->c.getOffice()).distinct().collect(Collectors.toSet());System.out.println(officeSet);Set<Integer> salarySet = employeeList.stream().map(c->c.getSalary()).distinct().collect(Collectors.toSet());System.out.println(salarySet);//查找办公室地点是New York的员工Optional<Employee> optionals = employeeList.stream().filter(c->c.getOffice().equals("New York")).findAny();System.out.println(optionals);System.out.println(">>>>>工资降序排序>>>>>");//按照工资的降序来列出员工信息List<Employee> sortSalaryEmployeeList = employeeList.stream().sorted((e1,e2)->Integer.compare(e2.getSalary(),e1.getSalary())).collect(Collectors.toList());System.out.println(sortSalaryEmployeeList);System.out.println(">>>>>姓名升序排序>>>>>");List<Employee> sortNameEmployeeList = employeeList.stream().sorted((e1,e2)->e1.getName().compareTo(e2.getName())).collect(Collectors.toList());System.out.println(sortNameEmployeeList);System.out.println(">>>>获取工资最高的前2条员工信息");List<Employee> dispaly2EmployeeList = employeeList.stream().sorted((e1,e2)->Integer.compare(e2.getSalary(),e1.getSalary())).limit(2).collect(Collectors.toList());System.out.println(dispaly2EmployeeList);System.out.println(">>>>获取平均工资");OptionalDouble averageSalary = employeeList.stream().mapToInt(c->c.getSalary()).average();System.out.println(averageSalary);System.out.println(">>>>获取工作地点的平均工资");OptionalDouble optionalDouble = employeeList.stream().filter(c->c.getOffice().equals("New York")).mapToInt(c->c.getSalary()).average();System.out.println(optionalDouble);System.out.println(">>>>>>Java8 Optional用法>>>>>>");Optional<String> stringOptional = Optional.of("test");System.out.println(stringOptional.get());Optional<String> isOptional = Optional.ofNullable("hello");System.out.println(isOptional.isPresent());System.out.println(isOptional.get());System.out.println(isOptional.orElse("0"));System.out.println(">>>>>>>>>>>>");//Optional<String> optionalVal = Optional.of(null);// System.out.println(optionalVal);Optional<String> optional = Optional.ofNullable("optional");System.out.println(optional);System.out.println(optional.isPresent());System.out.println(optional.get());System.out.println(optional.orElse("haha"));System.out.println(">>>>>>>>>>>>");Optional<Employee> employeeOptional_ = employeeList.stream().filter(c->c.getOffice().equals("New York")).findFirst();System.out.println(employeeOptional_);}

Java8 lambda 的使用相关推荐

  1. Java8 lambda表达式10个示例

    例1.用lambda表达式实现Runnable // Java 8之前: new Thread(new Runnable() {     @Override     public void run() ...

  2. java8 lambda表达式实现自定义用户组件,Don't Repeat Yourself

    2019独角兽企业重金招聘Python工程师标准>>> 一.用户组件的功能 使用java8 lambda表达式实现实现世界的一个例子:用户组件.此用户组件有以下几个操作:获取用户列表 ...

  3. Java8————Lambda表达式(二)

    译者注:文中内容均来自于官方教程<Lambda Expressions>,但是由于英汉语言的差异,部分语句官方描述过于冗余,因此译者根据通常状况的理解做了微调,但不会影响表达的含义.比如: ...

  4. lambda 对象去重_采用java8 lambda表达式 实现 java list 交集 并集 差集 去重复并集...

    采用java8 lambda表达式 实现java list 交集/并集/差集/去重并集 一般的javaList 交.并集采用简单的 removeAll retainAll 等操作,不过这也破坏了原始的 ...

  5. 【Java学习笔记之三十一】详解Java8 lambda表达式

    Java 8 发布日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里.在Java 8之前 ...

  6. lambda学习视频和stream学习视频(Java8 Lambda表达式视频教程)-Java爬虫-网络购物的正确打开方式

    百度网盘 链接:https://pan.baidu.com/s/1upU5EVXOQeho6poDYdnhiQ 提取码:088l Java8 Lambda表达式视频教程 https://www.bil ...

  7. Java8 lambda表达式,Comparator.comparing().thenComparing()报错

    环境 Java:1.8+ 前言 今天发了一个问题: 问题描述: 对List进行排序,如果在Comparator.comparing()方法中,只使用一个字段排序,没有问题. 但是如果使用多字段排序,并 ...

  8. 采用java8 lambda表达式 实现 java list 交集 并集 差集 去重复并集

    采用java8 lambda表达式 实现java list 交集/并集/差集/去重并集 一般的javaList 交.并集采用简单的 removeAll retainAll 等操作,不过这也破坏了原始的 ...

  9. Java8 Lambda表达式详解手册及实例

    先贩卖一下焦虑,Java8发于2014年3月18日,距离现在已经快6年了,如果你对Java8的新特性还没有应用,甚至还一无所知,那你真得关注公众号"程序新视界",好好系列的学习一下 ...

  10. java lambda collect_45分钟学会Java8 - Lambda和Stream

    Java11已出,Java8已是主流. 现在来一波操作,应该不会太迟(T_T) 注:本文持续更新 ^_^ 1. 前言 本文主要介绍Java8的2大主要新特性lambda表达式和Stream API,2 ...

最新文章

  1. 潜入java内存结构
  2. oracle删除后电脑卡,彻底删除oracle服务 -电脑资料
  3. php签名墙,肺功能检查质量控制网
  4. 栅格矢量化_学会用栅格系统,普通LOGO秒变高大上
  5. 信息学奥赛一本通 1089:数字反转 | 1953:【11NOIP普及组】数字反转 | OpenJudge NOI 1.5 29 | 洛谷 P1307 [NOIP2011 普及组] 数字反转
  6. WebStorm——最智能的Javascript IDE
  7. 蓝桥杯每日真题之货物摆放
  8. 点石成金_Index
  9. 人工智能如何可以思考?
  10. TTL转RS232电路设计
  11. 弗兰克赫兹实验计算机仿真实验报告,大学物理实验教学大纲
  12. 迅捷pdf转换器在线转换——六大转换
  13. bilibili视频流量数据潜望镜
  14. 查理芒格的25种人类误判心理学
  15. 经典动态规划OJ题目:接雨水or接青豆(多种方法,附详详细思维过程、解析及源码)
  16. C语言中%d等的意义
  17. 图片较多的网站,如淘宝京东、美丽说花瓣、QQ空间、百度图片等都采用哪些技术优化图片展示?
  18. python下载漫画
  19. 小程序(十)小程序缓存
  20. linux dvd视频,Gentoo Linux 10.1 LiveDVD快速安装法(视频)

热门文章

  1. android spinner控件详解,GitHub - LonelyPluto/TestSpinner: android控件——Spinner下拉框详解及使用...
  2. 跑毒的乌龟-0 : 随机漫步
  3. linux虚拟内存和win,linux下的vm(虚拟内存)和windows下的作用是一样的,均是防止真实内存资源不足准备的. linux的vm相关参数...
  4. MAB多臂老虎机/赌博机
  5. 1193, Unknown system variable 'tx_isolation'
  6. Ubunu16.04安装CPU版本Tensorflow
  7. python sys.exc_info()详解
  8. 矩阵论作业4,5,6讲
  9. 【CF 706】(C.Hard problem) + (D.Vasiliy's Multiset) + (E.Working routine)【最短路、01字典树、十字链表模拟】
  10. 【POJ 2449】第K短路【A*算法】