函数式接口

  就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口,函数式接口可以被隐式转换为lambda表达式。

  之前已有的函数式接口:
  java.lang.Runnable
  java.util.concurrent.Callable
  java.util.Comparator
  java.io.FileFilter

  1.8新增的函数式接口:
  java.util.function包下

  Predicate<T>——接收 T 并返回 boolean (常用)
  Consumer<T>——接收 T,不返回值 (常用)
  Function<T, R>——接收 T,返回 R (常用)
  Supplier<T>——提供 T 对象(例如工厂),不接收值
  UnaryOperator<T>——接收 T 对象,返回 T
  BinaryOperator<T>——接收两个 T,返回 T

lambda表达式

  lambda表达式的语法由参数列表、箭头符号 -> 和函数体组成。函数体既可以是一个表达式,也可以是一个语句块。
  eg: (int x, int y) -> x + y (表达式)
  eg:(Integer e) -> {
    double sqrt = Math.sqrt(e);
    double log = Math.log(e);

    return sqrt + log;
  } (语句块)
  意义:传入参数x和y,返回x和y的和
  表达式:表达式会被执行然后返回执行结果。
  语句块:语句块中的语句会被依次执行,就像方法中的语句一样。

方法引用:

  方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。
  方法引用有很多种,它们的语法如下:
  静态方法引用:ClassName::methodName
  实例上的实例方法引用:instanceReference::methodName
  超类上的实例方法引用:super::methodName
  类型上的实例方法引用:ClassName::methodName
  构造方法引用:Class::new
  数组构造方法引用:TypeName[]::new

  eg:

  1. List<String> names5 = Arrays.asList("peter", "anna", "mike", "xenia");
  2. names5.sort(String::compareTo);
  3. System.out.println(names5);
  1.  

public void testFun1() {
// comparing 是 Function<? super T, ? extends U> Function<T, R>——接收 T,返回 R
Person p1 = new Person();
p1.setName("hy");
p1.setAge(18);

  1.  

Person p2 = new Person();
p2.setName("dax");
p2.setAge(19);

  1.  

Person[] people = {p1, p2};
Comparator<Person> byName = Comparator.comparing(Person::getName);
Arrays.sort(people, byName);
for (Person person : people) {
System.out.println(person);
}
}

  1.  

Stream

Stream与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念,Stream 是对集合(Collection)对象功能的增强。

eg:内部迭代和外部迭代

  1. void innerOrOuter() {
  2. List<Person> list = new ArrayList<>();
  3. Person p1 = new Person();
  4. p1.setName("hy");
  5. p1.setAge(18);
  6.  
  7. Person p2 = new Person();
  8. p2.setName("dax");
  9. p2.setAge(19);
  10.  
  11. list.add(p1);
  12. list.add(p2);
  13.  
  14. for (Person p: list) {
  15. p.setAge(20);
  16. }
  17. System.out.println(list);
  18.  
  19. List<Person> list2 = new ArrayList<>();
  20. Person p21 = new Person();
  21. p21.setName("hy");
  22. p21.setAge(18);
  23.  
  24. Person p22 = new Person();
  25. p22.setName("dax");
  26. p22.setAge(19);
  27.  
  28. list2.add(p21);
  29. list2.add(p22);
  30.  
  31. list2.stream().forEach(p->p.setAge(20));
  32. System.out.println(list2);
  33. }

  Stream通用语法:

  Stream的操作:
  Intermediate(中间操作):
    map (mapToInt, flatMap 等)、 filter、 distinct(去重)、 sorted(排序)、 peek(对某个元素做单独处理生成新的Stream)、
    limit(取前N个元素)、 skip(丢弃前N个元素)、 parallel、 sequential、 unordered

  Terminal(结束操作,非短路操作):
    forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 iterator

  Short-circuiting(结束操作,短路操作):
    anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 limit

  代表例子:

  1. @Test
  2. public void testNormal() {
  3. // 1 线程
  4. new Thread(()-> testThread()).start();
  5.  
  6. // 2 遍历集合
  7. List<String> list = Arrays.asList("abd", "nba", "cba", "mctrady");
  8. list.stream().forEach(n-> System.out.println(n));
  9. list.forEach(n-> System.out.println(n));
  10.  
  11. // 3 map运用
  12. List<Integer> listInt = Arrays.asList(123, 456, 789, 101);
  13. listInt.stream().map(n->n*10).forEach(n-> System.out.println(n));
  14. System.out.println(listInt.stream().mapToInt(n->n).sum());
  15. System.out.println(listInt.stream().mapToInt(n->n).average().getAsDouble());
  16.  
  17. // 4 filter
  18. List<Integer> listInt2 = Arrays.asList(123, 456, 789, 101);
  19. listInt2.stream().filter(n->n>200).forEach(n-> System.out.println(n));
  20.  
  21. // 5 对每个元素应用函数
  22. List<Integer> listInt3 = Arrays.asList(123, 456, 789, 101);
  23. String str = listInt3.stream().map(n->n.toString()).collect(Collectors.joining(","));
  24. System.out.println(str);
  25. }
  26.  
  27. private void testThread() {
  28. System.out.println("线程操作");
  29. }
  1. List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");
  2. Collections.sort(names, new Comparator<String>() {
  3. @Override
  4. public int compare(String a, String b) {
  5. return b.compareTo(a);
  6. }
  7. });
  8. System.out.println(names);
  9.  
  10. List<String> names1 = Arrays.asList("peter", "anna", "mike", "xenia");
  11. Collections.sort(names1, (String a, String b) -> {
  12. return b.compareTo(a);
  13. });
  14. System.out.println(names1);
  15.  
  16. List<String> names2 = Arrays.asList("peter", "anna", "mike", "xenia");
  17. Collections.sort(names2, (String a, String b) -> b.compareTo(a));
  18. System.out.println(names2);
  19.  
  20. List<String> names3 = Arrays.asList("peter", "anna", "mike", "xenia");
  21. Collections.sort(names3, (a, b) -> b.compareTo(a));
  22. System.out.println(names3);
  23.  
  24. List<String> names4 = Arrays.asList("peter", "anna", "mike", "xenia");
  25. Collections.sort(names4, String::compareTo);
  26. System.out.println(names4);
  27.  
  28. List<String> names5 = Arrays.asList("peter", "anna", "mike", "xenia");
  29. names5.sort(String::compareTo);
  30. System.out.println(names5);
  31.  
  32. List<String> names6 = Arrays.asList("peter", "anna", "mike", "xenia");
  33. // 反转
  34. names6.sort(Comparator.comparing(String::toString).reversed());
  35. System.out.println(names6);

  

  1. public void testStream() throws ClassNotFoundException {
  2. List<Person> list = new ArrayList<>();
  3. Person p1 = new Person();
  4. p1.setName("hy");
  5. p1.setAge(18);
  6.  
  7. Person p2 = new Person();
  8. p2.setName("dax");
  9. p2.setAge(19);
  10.  
  11. list.add(p1);
  12. list.add(p2);
  13.  
  14. System.out.println(list);
  15.  
  16. list.stream().forEach(p -> p.setAge(20));
  17.  
  18. System.out.println(list);
  19.  
  20. list.stream().filter(s->s.getName().equals("hy")).forEach(p->p.setAge(21));
  21. System.out.println(list);
  22.  
  23. List<Person> listHy = list.stream().filter(s->s.getName().equals("hy") && s.getAge() == 21).collect(Collectors.toList());
  24. System.out.println(listHy);
  25.  
  26. int age = list.stream().mapToInt(s->s.getAge()).sum();
  27. System.out.println("年龄总和:" + age);
  28.  
  29. Optional<Person> firstHy = list.stream()
  30. .filter(s -> s.getName().equals("hy"))
  31. .findFirst();
  32. Person person = firstHy.get();
  33. System.out.println(person);
  34. }

  总结:

  关于lambda和Stream的学习暂时先到这,如果日常用的就是1.8版本,这些就慢慢熟悉了,习惯了1.7以前面向对象编程的思维需要一些时间转换。而1.8里面lambda和Stream无疑是让Java更加的拥抱变化,在函数式编程里面也有了一些说话的位置。

  参考:

  http://zh.lucida.me/blog/java-8-lambdas-insideout-language-features/

  https://blog.csdn.net/hanyingzhong/article/details/60965197

  https://segmentfault.com/a/1190000008876546

Java8简明学习之Lambda表达式的更多相关文章

  1. Java8学习笔记----Lambda表达式 (转)

    Java8学习笔记----Lambda表达式 天锦 2014-03-24 16:43:30 发表于:ATA之家       本文主要记录自己学习Java8的历程,方便大家一起探讨和自己的备忘.因为本人 ...

  2. Java8学习(3)- Lambda 表达式

    猪脚:以下内容参考<Java 8 in Action> 本次学习内容: Lambda 基本模式 环绕执行模式 函数式接口,类型推断 方法引用 Lambda 复合 上一篇Java8学习(2) ...

  3. JAVA8学习——深入浅出Lambda表达式(学习过程)

    JAVA8学习--深入浅出Lambda表达式(学习过程) lambda表达式: 我们为什么要用lambda表达式 在JAVA中,我们无法将函数作为参数传递给一个方法,也无法声明返回一个函数的方法. 在 ...

  4. 【Java8新特性】你知道Java8为什么要引入Lambda表达式吗?

    写在前面 这是一道真实的面试题,一个读者朋友出去面试,面试官竟然问他这样一个问题:你说说Java8中为什么引入Lambda表达式?引入Lambda表达式后有哪些好处呢?还好这个朋友对Java8早有准备 ...

  5. 【Java8新特性】Lambda表达式基础语法,都在这儿了!!

    写在前面 前面积极响应读者的需求,写了两篇Java新特性的文章.有小伙伴留言说:感觉Lambda表达式很强大啊!一行代码就能够搞定那么多功能!我想学习下Lambda表达式的语法,可以吗?我的回答是:没 ...

  6. java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合

    java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合 比如,我有一张表: entity Category.java service CategoryServic ...

  7. java8学习之Lambda表达式继续探讨&Function接口详解

    对于上次[http://www.cnblogs.com/webor2006/p/8186039.html]已经初步引入的Java8中Stream流的概念,其中使用了map的操作,它需要接受一个Func ...

  8. java8学习之Lambda表达式深入与流初步

    Lambda表达式深入: 在上一次[http://www.cnblogs.com/webor2006/p/8135873.html]中介绍Lambda表达式的作用时,其中说到这点: 如标红处所说,既然 ...

  9. java8学习之Lambda表达式初步与函数式接口

    对于Java8其实相比之前的的版本增加的内容是相当多的,其中有相当一大块的内容是关于Lambda表达式与Stream API,而这两部分是紧密结合而不能将其拆开来对待的,但是是可以单独使用的,所以从学 ...

随机推荐

  1. python 函数中使用全局变量

    python 函数中如果需要使用全局变量,需要使用 global + 变量名 进行声明, 如果不声明,那么就是重新定义一个局部变量,并不会改变全局变量的值 n [1]: a = 3 In [2]: d ...

  2. MySQL(分组、连表操作、备份数据库)

    day58 分组 参考:https://www.cnblogs.com/xp796/p/5262187.html select dept, max(salary) from department gr ...

  3. Concurrent包工具类使用

    一.读写锁 传统的同步锁就是独占式锁,当线程使用资源时候保持独占,无论读写.当人们发现请求队列(假设)中相邻请求为读-读的时候,阻塞是一种浪费资源的操作.比如公告板,所有路过的人(请求)都是读操作,并 ...

  4. D04——C语言基础学PYTHON

    C语言基础学习PYTHON——基础学习D04         20180810内容纲要: 1 内置函数 2 装饰器 3 生成器 4 迭代器 5 软件目录结构规范 6 小结 1 内置函数 内置函数方法详 ...

  5. P1484 种树

    P1484 种树 题意: 在n个数中选出至多k个数,且两两不相邻,并使所选数的和最大. n<=500000  思路 先建一个堆,把所有点扔进去,当取出队首元素时累加到答案时,把它和它左右两个点一 ...

  6. 无apk,怎么获取app的activity

    在做app自动化测试之前,有个前提条件,就是要获取当前app的包名和当前活动的activity.如果有提供了.apk,就可以直接通过adb命令获取到包名和欢迎页面:有种软件是手机自带的的,我们不知道a ...

  7. POJ 1118

    #include<iostream> #include<set> #include<stdio.h> #include<math.h> #include ...

  8. Luogu P4670 [BalticOI 2011 Day2]Plagiarism 题解

    我最近是不是数据结构学傻了啊... 这道题看是1e5,所以复杂度为\(O(nlogn)\)的是完全可以跑过去的,然后看题,要求的对于每个数满足要求的区间的长度之和,我们自然而然的就可以想到用FHQ-T ...

  9. Java之集合(二十七)其它集合

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7551368.html 1.前言 本章介绍剩余的3个集合类:ConcurrentSkipListSet.CopyO ...

  10. IE中的userData

    之前做项目时用到了localstorage,但是考虑到浏览器存在IE8以下不兼容问题,所以来介绍以下IE中的userData. 本地存储解决方案很多,比如Flash SharedObject.Goog ...