一、Lambda表达式:

Lambda表达式取代了匿名类,取消了模板,允许用函数式风格编写代码。这样的优势是:可读性更好,表达更清晰。

在Java生态系统中,函数式表达与对面向对象的全面支持是个激动人心的进步。将进一步促进并行第三方库的发展,充分利用多核CPU。

在Java 8里面,所有的Lambda的类型都是一个接口,而Lambda表达式本身,也就是”那段代码“,需要是这个接口的实现。这是理解Lambda的一个关键所在,简而言之就是,Lambda表达式本身就是一个接口的实现。

// 无参数, 返回1+2的结果
() -> 1+2;
 
// 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x;
 
// 接收2个参数(数字),返回表达式运算的结果
(x, y) -> x + y;
 
// 多个语句要用大括号包裹, 并且返回值要用return指明
(x, y) -> {
	int result = x + y;
	System.out.print(result);
	return result;
};

 Lambda表达式有如下约定:

  • 一个 Lambda 表达式可以有零个或多个参数;
  • 参数的类型既可以明确声明,也可以根据上下文来推断。例如:(int a)与(a)效果相同;
  • 所有参数需包含在圆括号内,参数之间用逗号相隔。例如:(a, b) 或 (int a, int b) 或 (String a, int b, float c);
  • 空圆括号代表参数集为空。例如:() -> 42;
  • 当只有一个参数,且其类型可推导时,圆括号()可省略。例如:a -> return a*a;
  • Lambda 表达式的主体可包含零条或多条语句;
  • 如果 Lambda 表达式的主体只有一条语句,花括号{}可省略。匿名函数的返回类型与该主体表达式一致;
  • 如果 Lambda 表达式的主体包含一条以上语句,则表达式必须包含在花括号{}中(形成代码块)。匿名函数的返回类型与代码块的返回类型一致,若没有返回则为空。

 

1. 无参数的Lambda表达式
1) 如果只有一行的时候,不需要加 分号;

Thread类的使用

public class Main {
    public static void main(String[] args) {
        new Thread(
            () -> System.out.println("this is thread")
            ).start();
    }
}

 Runnable接口的使用,调用的是run() 方法

public class Main {
    public static void main(String[] args) {
        Runnable myrun = () -> System.out.println("this is test");
        myrun.run();
    }
}

2) 如果是多行输出的话,则需要 中括号 括起来 {  },并且需要加 分号

public class Main {
    public static void main(String[] args) {
        new Thread(
            () -> {
                System.out.println("this is thread");
                System.out.println("this is sencond");
            }
            ).start();
    }
}

二、Stream类

Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选、排序、聚合等。

stream不存储数据,而是按照特定的规则对数据进行计算,一般会输出结果。
stream不会改变数据源,通常情况下会产生一个新的集合或一个值。
stream具有延迟执行特性,只有调用终端操作时,中间操作才会执行。

常用创建的方式
1、通过 java.util.Collection.stream() 方法用集合创建流

List<String> list = Arrays.asList("a", "b", "c");
// 创建一个顺序流
Stream<String> stream = list.stream();
// 创建一个并行流
Stream<String> parallelStream = list.parallelStream();

2、使用**java.util.Arrays.stream(T[] array)**方法用数组创建流

int[] array={1,3,5,6,8};
IntStream stream = Arrays.stream(array);

3、使用Stream的静态方法:of()、iterate()、generate()

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);

Stream<Integer> stream2 = Stream.iterate(0, (x) -> x + 3).limit(4);
stream2.forEach(System.out::println);

Stream<Double> stream3 = Stream.generate(Math::random).limit(3);
stream3.forEach(System.out::println);

stream是顺序流,由主线程按顺序对流执行操作,而parallelStream是并行流。
Optional类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
Stream也是支持类似集合的遍历和匹配元素的,只是Stream中的元素是以Optional类型存在的。Stream的遍历、匹配非常简单。
3.1 遍历/匹配(foreach/find/match)
3.2 筛选(filter)返回true或false
3.3 聚合(max/min/count)
3.4 映射(map/flatMap) 一个流映射到另一个流
3.5 归约(reduce)
3.6 收集(collect) 将流中元素收集起来,返回一个集合或数组
3.6.2 统计(count/averaging)
3.6.3 分组(partitioningBy/groupingBy)
3.7 排序(sorted)
3.8 提取/组合