jdk1.8新特性

JDK1.8 新特性

1. 接口的增强

jdk1.8 对接口进行了增强可以实现的普通方法,也可以创建静态方法。
interface MyTest{

    void printHello();

    default void printDefault(){
        System.out.println("this is default method");
    }

    static void printStaticMethod(){
        System.out.println("this is static method");
    }

}

2. 函数式接口

两种实现方式

  1. 在接口中定义一唯一一个抽象方法

  2. 使用@FunctionalInterface标注接口

  3. 注解只是强制约束只能存在一个抽象方法,可以存在static方法和 default修饰的普通方法

@FunctionalInterface
interface  FunctionInterface{
    void testFuntionInterface(String content);
    default void testDefault(){
        System.out.println("default");
    }
    static void testStatic(){
        System.out.println("static");
    }

    boolean equals(Object obj); //可以存在Object类中的public方法
}

3. Lambda表达式

3.1 lambda表达式的基本语法

在lambda表达式中没有方法名字只需要关心参数和方法体。NoReturnNoParam,SingleReturnMutipleParam接口
参数 定义在()中
方法体定义在{}中
 //无参数无返回值
 NoReturnNoParam lambda1 = () -> {
 System.out.println("lambda1");
 };
 lambda1.test();

// 两个参数一个返回值
SingleReturnMutipleParam lambda2 = (int a, int b) -> {
return a + b;
};

System.out.println(lambda2.test(10,2));

4.集合的流式操作

4.1 集合流的简介

4.1.1 集合的流式变成简介
Stream 是jdk1.8之后出现的新特新。Stream是对集合操作的增强,流不是集合的元素,不是一种数据结构,不负责数据的存储:流更像是一个迭代器,可以单向的遍历一个集合中的元素并且不可循环。
4.1.2 为什么要使用集合的流式编程
对集合中的元素进行操作的时候,需要使用到其他的操作结果。在这个过程中,集合的流式编程可以大幅度的简化代码的数量,将数据源中的数据读取到一个流中,可以对这个流中的数据进行操作。每次的操作结果也是一个流对象,可以对这个流再进行其他的操作。
4.1.3 使用步骤
1. 获取数据源,将数据源中的数据读取到流中
2. 对流中的数据进行各种操作
3. 对流中的数据进行整合整理

4.2 数据源获取

4.2.1 数据源简介
是流中数据的来源,是集合的流式编程的第一步,将数据源中的数据读取到流中,进行处理。
4.2.2 数据源的获取
//这个过程就是将容器中的数据读取到流中
//1. 集合的流式编程
ArrayList<Integer> list = new ArrayList<>();

Stream<Integer> stream = list.stream(); 

//2. 通过Collection 接口的parallelStream() 方法获取
Stream<Integer> integerStream = list.parallelStream();

他们都是获取数据源的方法,不同点是stream()获取的数据源是串行的,parallelSteam()获取数据源是并行的。parallelStream()内部集成了多个线程对流中的数据进行操作效率更高。

4.3 最终操作

4.3.1 最终操作简介
将流中的数据整合到一起可以存储一个集合,也可以直接对流中的数据进行遍历,数据统计。 通过最终操作,需要掌握如何从流中读取数据。
4.3.2 collect
将流中的数据收集到一起:对这些数据进行一些处理。最常见的处理就是将流中的数据存入一个集合。collector方法的参数,是一个Collector接口而且这个接口不是一个函数式接口,实现这个接口,可以自定义收集的规则。
直接使用Collectors工具类提供的方法即可。


//1. 集合的流式编程
ArrayList<Integer> list = new ArrayList<>();

Collections.addAll(list, 1,2,3,5,4,6,7);

//1.Collector 转成list
List<Integer> collect = list.stream().collect(Collectors.toList());

System.out.println(collect);
//2. 转成set
Set<Integer> collect1 = list.stream().collect(Collectors.toSet());
System.out.println(collect1);

//3 转成map 提供了连个函数式接口的实现
Map<Integer, Integer> collect2 = list.stream().collect(Collectors.toMap(element -> element % 10, element -> element));
System.out.println(collect2);
4.3.3 reduce

​ 将流中的数据按照一定的规则聚合起来

//得到的其实是一个Optional类型,需要使用get() 获取到里面的数据Integer integer = list.stream().reduce((e1, e2) -> e1 + e2).get();
4.3.4 count
long count = list.stream().count();System.out.println(count);
4.3.5 foreach
list.stream().forEach(System.out::print);
4.3.6 max & min
Integer max = list.stream().max(Integer::compareTo).get();
System.out.println("max is " + max);

Integer min = list.stream().min(Integer::compareTo).get();
System.out.println("min is " + min);
4.3.7 allMatch & anyMatch & noneMatch
allMatch:只有当流中的所有元素都匹配规则,才会返回ture
anyMatch:只要流中任意数据满足指定规则,都会返回true
noneMatch:只有当流中的所有元素都不匹配指定的指定的规则才返回ture
System.out.println(list.stream().allMatch(element -> element > 5 ));
System.out.println(list.stream().anyMatch(element -> element > 4));
System.out.println(list.stream().noneMatch(ele -> ele > 10));
4.3.8 find
find: 从流中获取一个元素(一般情况下获取流中第一个元素)
findAny:从流中获取一个元素(一般情况下获取流中第一个元素)

多线程情况下获取的不同

4.4 中间操作

4.4.1 中间操作简介
 将数据读取到流中。中间操作就是对流中的数据进行各种操作,中间操作是可以连起来的,每一个操作返回一个Stream对象直到最终操作。
4.4.2 filter
list.stream().filter(ele -> ele.contains("a")).forEach(System.out::print);

4.4.3 distinct
// 去重规则和hashset相同
list.stream().distinct().forEach(System.out::println);

4.4.4 sorted
list.stream().sorted().forEach(System.out::println);
list.stream().sorted((o1, o2) -> o1.length() - o2.length()).forEach(System.out::println);
4.4.5 limit & skip
list.stream().skip(3).forEach(ele -> {System.out.print(ele + " ");});
list.stream().limit(3).forEach(ele -> {System.out.print(ele + " ");});

continue …

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值