1.Lambda表达式概念

Lambda表达式是JDK1.8开始之后的新技术,是一种代码的新语法。
作用:核心目的是为了简化匿名内部类的代码写法。
使用:Lambda表达式不能简化所有匿名内部类的写法,只能简化接口中只有一个抽象方法的内部类形式。
案例:

1.1 lambda表达式简化Comparator接口

  1. // lambda表达式简化Comparator接口
  2. public static void main(String[] args) {
  3. List<Student> list=new ArrayList();
  4. Student student1 =new Student("李四",20,'男');
  5. Student student2 =new Student("王五",55,'女');
  6. Student student3 =new Student("二麻子",22,'男');
  7. Collections.addAll(list,student1,student2,student3);
  8. // Collections.sort(list, new Comparator<Student>() {
  9. // @Override
  10. // public int compare(Student o1, Student o2) {
  11. // return o1.getAge()-o2.getAge();
  12. // }
  13. // });
  14. Collections.sort(list,(Student t1, Student t2) ->{
  15. return t1.getAge()-t2.getAge();
  16. });
  17. System.out.println(list);
  18. }

2.lambda表达式简化Runable接口

  1. public static void main(String[] args) {
  2. Thread thread=new Thread(new Runnable() {
  3. @Override
  4. public void run() {
  5. System.out.println(Thread.currentThread().getName()+"执行了~~~~");
  6. }
  7. });
  8. thread.start();
  9. new Thread(new Runnable() {
  10. @Override
  11. public void run() {
  12. System.out.println(Thread.currentThread().getName()+"执行了~~~~");
  13. }
  14. }).start();
  15. // lambda表达式
  16. new Thread(()->{
  17. System.out.println(Thread.currentThread().getName()+"执行了~~~~");
  18. }).start();
  19. }

2. Lambda表达式的省略写法(进一步在Lambda表达式的基础上继续简化)

  1. 1)方法体代码只有一行代码。可以省略大括号不写,同时要省略分号。<br /> 此时,如果这行代码是return语句,必须省略return不写,同时也必须省略";"不写<br /> 2)如果只有一个参数,参数类型可以省略,同时()也可以省略。

3.方法引用

  1. 方法引用是为了进一步简化Lambda表达式的写法。<br /> 方法引用的格式:类型或者对象::引用的方法

3.1 静态方法的引用

  1. public static int CompareByAge(Student o1,Student o2){
  2. return o1.age-o2.age;
  3. }
  4. Collections.sort(list,Student::CompareByAge);

3.2 实例方法的引用

  1. // 对象是 System.out = new PrintStream();
  2. // 实例方法:println()
  3. // 前后参数正好都是一个
  4. lists.forEach(s -> System.out.println(s));
  5. // 实例方法的引用
  6. lists.forEach(System.out::println);

3.3 特定方法的引用

  1. // String中的特定方法
  2. // 特定类型的方法引用:
  3. Arrays.sort(strs, String::compareToIgnoreCase);

3.4 构造器引用

  1. String[] arr=list.stream().toArray(String[]::new);
  2. System.out.println(Arrays.toString(arr));

3.stream流

1.Lambda所带来的函数式编程,引入了一个全新的Stream流概念 ,用于解决已有集合/数组类库有的弊端。
stream流解决了已有集合类库或者数组API的弊端,简化集合和数组的操作!

3.1 stream流的获取

  1. public static void main(String[] args) {
  2. //Map集合获取流
  3. // Collection集合如何获取Stream流。
  4. Collection<String> c = new ArrayList<>();
  5. Stream<String> ss = c.stream();
  6. //Map集合获取流
  7. Map<String, Integer> map = new HashMap<>();
  8. // 先获取键的Stream流。
  9. Stream<String> keyss = map.keySet().stream();
  10. // 在获取值的Stream流
  11. Stream<Integer> valuess = map.values().stream();
  12. // 获取键值对的Stream流(key=value: Map.Entry<String,Integer>)
  13. Stream<Map.Entry<String,Integer>> keyAndValues = map.entrySet().stream();
  14. //数组获取流
  15. String[] arrs = new String[]{"Java", "JavaEE" ,"Spring Boot"};
  16. Stream<String> arrsSS1 = Arrays.stream(arrs);
  17. Stream<String> arrsSS2 = Stream.of(arrs);
  18. }

3.2 stream流常见API

  1. public static void main(String[] args) {
  2. List<String> list=new ArrayList<>();
  3. list.add("张三");
  4. list.add("李三");
  5. list.add("李四");
  6. list.add("王三");
  7. list.add("张六");
  8. list.add("张天明");
  9. //filter():过滤元素 forEach() : 逐一处理
  10. list.stream().filter(s->s.startsWith("张")).filter(s ->s.length()==2).forEach(System.out::println);
  11. // count():统计个数
  12. long size=list.stream().filter(s->s.length()==2).count();
  13. System.out.println(size);
  14. // limit():取前几个元素
  15. list.stream().filter(s->s.length()==2).limit(2).forEach(s -> System.out.println(s));
  16. // skip(): 跳过前几个
  17. list.stream().filter(s->s.length()==2).skip(2).forEach(s -> System.out.println(s));
  18. // map():加工方法(把原来的元素加工以后,从新放上去)
  19. list.stream().map(s->"盒子"+s).forEach(s-> System.out.println(s));
  20. list.stream().map(s->new Student(s)).forEach(s-> System.out.println(s));
  21. // concat(): 合并流
  22. Stream<Integer> s1=Stream.of(1,5,6,8);
  23. Stream<String> s2=list.stream();
  24. Stream<Object> s3=Stream.concat(s1,s2);
  25. s3.forEach(s-> System.out.println(s));
  26. }

3.3 收集流

  1. public static void main(String[] args) {
  2. List<String> list=new ArrayList<>();
  3. list.add("张三");
  4. list.add("李三");
  5. list.add("李四");
  6. list.add("王三");
  7. list.add("张六");
  8. list.add("张天明");
  9. list.add("张天明");
  10. //set
  11. Set<String>set=list.stream().collect(Collectors.toSet());
  12. System.out.println(set);
  13. //list
  14. List<String>newList=list.stream().collect(Collectors.toList());
  15. System.out.println(newList);
  16. //数组
  17. String [] arr=list.stream().toArray(String[]::new);
  18. System.out.println(Arrays.toString(arr));
  19. }