1. lamda表达式的学习链接
  2. lamda表达式学习链接
  3. 常用的lamda表达式链接
  4. lamda使用方法链接
  5. 所有接口函数的介绍链接

    什么是lamda表达式?

  6. ambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。

  7. lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体。Lambda表达式还增强了集合库。 Java SE 8添加了2个对集合数据进行批量操作的包: java.util.function 包以及java.util.stream 包。 流(stream)就如同迭代器(iterator),但附加了许多额外的功能
  8. 在Lambda表达式中this是指外围实例,而匿名类中的this是指匿名类实例。如果想在Lambda表达式里面修改外部变量的值也是可以的,可以将变量定义为非局部变量,即为实例变量或者将变量定义为数组。Lambda表达式如果引用某局部变量,则直接将其视为final。
  9. 1.lambda表达式没有命名,用来像传递数据一样传递操作。2.函数接口指的是只有一个抽象方法的接口,被当做是lambda表达式的类型。最好使@FunctionalInterface 注解,防止其他人在里面添加方法。只需要在想要执行的地方利用传递的对象调用对应的接口中唯一的方法即可。

    stream的特性

    1.stream不存储数据 2.stream不改变源数据 3.stream的延迟执行特性

通常我们在数组或集合的基础上创建stream,stream不会专门存储数据,对stream的操作也不会影响到创建它的数组和集合,对于stream的聚合、消费或收集操作只能进行一次,再次操作会报错。延迟性是指当stream的终结操作执行的时候,前面的中间操作才执行。

当我们操作一个流的时候,一般并不会修改流底层的集合(即使集合是线程安全的),如果遍历的时候删除和添加会抛出ConcurrentModificationException异常,而ls.stream().foreach()的时候调用ls的set方法是可以的(比如ls。set(0,0))是可以修改原来集合的元素,如果集合里存的是引用类型也可以重新set或者直接改变对象里的字段。

由于stream的延迟执行特性,在聚合操作执行前修改数据源是允许的。并且会影响到流里。

为什么要用lamda表达式?

lamda表达式的格式,用法?

基本语法: (parameters) -> expression 或 (parameters) ->{ statements; } 翻译 (参数) -> 表达式 或 (参数) ->{ 声明; } 左侧为输入参数,右侧为对参数执行的运算,中间用 -> 来连接 , 这很像数学中的函数,输入变量,然后函数处理变量。

  1. // 1. 不需要参数,返回值为 5
  2. () -> 5
  3. // 2. 接收一个参数(数字类型),返回其2倍的值
  4. x -> 2 * x
  5. // 3. 接受2个参数(数字),并返回他们的差值
  6. (x, y) -> x y
  7. // 4. 接收2个int型整数,返回他们的和
  8. (int x, int y) -> x + y
  9. // 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
  10. (String s) -> System.out.print(s)

一、Java8 常用的几个lambda函数接口

常用接口函数链接

  1. Supplier
  2. Predicate

predicate详细了解链接

  1. @FunctionalInterface
  2. public interface Predicate<T> {
  3. /**
  4. * 具体过滤操作 需要被子类实现.
  5. * 用来处理参数T是否满足要求,可以理解为 条件A
  6. */
  7. boolean test(T t);
  8. /**
  9. * 调用当前Predicate的test方法之后再去调用other的test方法,相当于进行两次判断
  10. * 可理解为 条件A && 条件B
  11. */
  12. default Predicate<T> and(Predicate<? super T> other) {
  13. Objects.requireNonNull(other);
  14. return (t) -> test(t) && other.test(t);
  15. }
  16. /**
  17. * 对当前判断进行"!"操作,即取非操作,可理解为 ! 条件A
  18. */
  19. default Predicate<T> negate() {
  20. return (t) -> !test(t);
  21. }
  22. /**
  23. * 对当前判断进行"||"操作,即取或操作,可以理解为 条件A ||条件B
  24. */
  25. default Predicate<T> or(Predicate<? super T> other) {
  26. Objects.requireNonNull(other);
  27. return (t) -> test(t) || other.test(t);
  28. }
  29. /**
  30. * 对当前操作进行"="操作,即取等操作,可以理解为 A == B
  31. */
  32. static <T> Predicate<T> isEqual(Object targetRef) {
  33. return (null == targetRef)
  34. ? Objects::isNull
  35. : object -> targetRef.equals(object);
  36. }
  37. }
  1. Consumer
  2. Function