Java 8新特性

简介: Java 8新特性

Java 8新特性

Lambda表达式:

需要函数式接口的支持:

若接口中只有一个抽象方法时,就是函数式接口。。

@FunctionalInterface注解 ,可以检查是否是函数式接口

基础语法:新的操作符:: “ -> ” lambda操作符

将lambda 拆成俩部分,

左侧:Lambda参数列表

右侧:Lambda表达式中所需要实现的功能 。即Lambda体

变化形势:

语法格式一: 无参数,无返回值

()-> sout

语法格式二:有一个参数,无返回值

(X)-> sout(X)

语法格式三:若只有一个参数,那么参数的小括可以不写

X -> sout(X)

语法格式四:有两个以上的参数,并且Lambda 体中有多条语句

Comparator com = (x,y) -> { System.out.println(“=========”);
return Integer.compare(x,y);
} ;

语法格式五:并且Lambda 体中有一条语句 ,

括 号和 return语句都可以不写

Comparator com = (x,y) -> Integer.compare(x,y);

四大核心函数式接口:

1:Consumer<T> :消费形接口
       void  accept(T  t)
2:Supplier<T> : 供给形接口
       void  get()
3:Function<T, R > :函数型接口   R返回类型,,T参数
       R apply (T  t)
4:Predicate <R>  :断言型接口
       boolean test ( T  , t)

方法引用

1:对象 : : 实例方法名

2:类 : : 静态方法名

3:类 : : 实例方法名

构造器引用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PMdVBVeU-1665058647031)(C:\Users\12926\AppData\Roaming\Typora\typora-user-images\1658394373040.png)]

数组引用:

type[] :: new ;

Collectors.toList() 将流中的所有元素导出到一个列表( List )中

map 方法可以让我们进行一些流的转化,比如原来流中的元素是 A,通过 map 操作,可以使返回的流中的元素是 B

public void testMap() {
        List<String> list = new ArrayList<String>() {{
            add("1");
            add("2");
            add("3");
        }};
        //通过 map 方法list中元素转化成 小写
        List<String> strLowerList = list.stream()
                .map(str -> str.toLowerCase())
                .collect(Collectors.toList());
    }
List<String> collect = list.stream()
                // 过滤掉我们希望留下来的值
                // 表示我们希望字符串是 1 能留下来
                // 其他的过滤掉
                .filter(str -> "1".equals(str))
                .collect(Collectors.toList());
        collect.forEach(c -> System.out.println(c));  //遍历List集合的俩种方式
        System.out.println("==========================");
        //遍历List集合的俩种方
        Iterator<String> iterator = collect.iterator();
        if (iterator.hasNext()) {
            String next = iterator.next();
            System.out.println("======"+ next);
        }

MapToInt

MapToDouble

public void testMapToInt() {
        List<String> list = new ArrayList<String>() {{
            add("1");
            add("2");
            add("3");
        }};
        list.stream()
                .mapToInt(s->Integer.valueOf(s))
                // 一定要有 mapToObj,因为 mapToInt 返回的是 IntStream,因为已经确定是 int 类型了
                // 所有没有泛型的,而 Collectors.toList() 强制要求有泛型的流,所以需要使用 mapToObj
                // 方法返回有泛型的流
                .mapToObj(s->s)
                .collect(Collectors.toList());
        list.stream()
                .mapToDouble(s->Double.valueOf(s))
                // DoubleStream/IntStream 有许多 sum(求和)、min(求最小值)、max(求最大值)、average(求平均值)等方法
                .sum();
    }

Distinct

distinct 方法有去重的功能:

public void testDistinct(){
        List<String> list = new ArrayList<String>() {{
            add("1");
            add("2");
            add("2");
        }};
        list.stream()
                .map(s -> Integer.valueOf(s))
                .distinct()
                .collect(Collectors.toList());
    }

Sorted

Sorted 方法提供了排序的功能,并且允许我们自定义排序。

stream流的创建

步骤:

1:首先创建stream流,

2:中间对流的操作

3:终止操作

创建流的几种方式:

1:可以通过Collection 系列的集合提供的stream (串行流)或paralleStream(并行流)

ArrayList<String> list = new ArrayList<>();
   Stream<String> stream = list.stream();

2:可以通过Arrays的 静态 stream() 方法。

emp[] emp01 = new  emp[10];
Stream<emp> stream1 = Arrays.stream(emp01);

3:可以通过Stream的 静态方法 ----> of()

Stream<emp> emp011 = Stream.of(emp01);

4:无限流 通过Stream 的 iterate

iterate :
Stream<Integer> stream2 = Stream.iterate(1, (x) -> x + 1);
生成: 
    Stream.generate(() -> Math.random());

Stream流的映射:

Collectors.toList() 将流中的所有元素导出到一个列表( List )中

map 方法可以让我们进行一些流的转化,比如原来流中的元素是 A,通过 map 操作,可以使返回的流中的元素是 B

FlatMap:方法可以让我们进行一些流的转化,,返回的结果是一个stream流

stream的排序方式:

sort : 自然排序(Comparable)

定制排序(Comparator)

list.stream()
                .sorted((e1,e2) -> {
                    if (e1.getAge().equals(e2.getAge())) {
                        return e1.getName().compareTo(e2.getName());
                    }else {
                        return e1.getAge().compareTo(e2.getAge());
                    }
                }).collect(Collectors.toList()).forEach(System.out::println);

Stream 流的查找与匹配:

/**

* stream 流的查找与匹配

* allMatch 查找所有是否匹配的元素

* anyMatch 查找是否有任意一个元素满足当前匹配的元素

* noneMatch 没有一个匹配当前的元素

* findFirst 查找第一个元素

* fingAny 查找任意一个元素

* count 统计 流中元素的总个数

* max 返回流中最大的值

* min 返回流中最小的值

*/

import org.junit.jupiter.api.Test;
import org.junit.platform.commons.util.StringUtils;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Test02 {
//    List<emp> list = Arrays.asList(
//            new emp("xiao",22, emp.Status.BUSY),
//            new emp("xia",30, emp.Status.VOCATION),
//            new emp("xialijun",99, emp.Status.BUSY),
//            new emp("xia0",30, emp.Status.FREE)
//    );
//    @Test
//    public void test(){
//        Stream<emp> stream = list.stream().filter(e -> e.getAge() > 20)
//                .limit(2)
//                .distinct().skip(1);
//        stream.forEach(System.out::println);
//    }
//    @Test
//    public void test1(){
        list.stream()
                .map(emp::getName).forEach(System.out::println);
//        list.stream()
//                .sorted((e1,e2) -> {
//                    if (e1.getAge().equals(e2.getAge())) {
//                        return e1.getName().compareTo(e2.getName());
//                    }else {
//                        return e1.getAge().compareTo(e2.getAge());
//                    }
//                }).collect(Collectors.toList()).forEach(System.out::println);
//    }
    @Test
    public void test2(){
        List<emp> list = Arrays.asList(
                new emp("xiao",220, emp.Status.BUSY),
                new emp("xia",30, emp.Status.VOCATION),
                new emp("xialijun",99, emp.Status.BUSY),
                new emp("xia0",30, emp.Status.FREE)
        );
        boolean match = list.stream().allMatch((e) -> e.getStatus()
                .equals(emp.Status.BUSY));
        if (StringUtils.isNotBlank(String.valueOf(match))) {
            System.out.println(match);
        }
        System.out.println("===================");
        boolean b = list.stream()
                .anyMatch((e) -> e.getStatus().equals(emp.Status.BUSY));
        System.out.println(b);
        System.out.println("====================");
        Optional<emp> first = list.stream().findFirst();
//        first.orElse(0);
        long count = list.stream().count();
        System.out.println(first);
        System.out.println(count);
        System.out.println("'======================================================");
        Optional<emp> max = list.stream().max(Comparator.comparingInt(emp::getAge));
        System.out.println(max.get());
        System.out.println("-------------------------------------------------------------------------");
        Optional<emp> min = list.stream()
                .filter(e -> e.getStatus().equals(emp.Status.BUSY))
                .min(Comparator.comparingInt(emp::getAge));
        System.out.println(min);
        Optional<Integer> min1 = list.stream().map(emp::getAge).min(Integer::compareTo);
        Optional<Integer> min2 = list.stream().map(emp::getAge).min(Integer::compare);
        System.out.println(min1);
        System.out.println(min2);
    }
}

Stream 流的 约束与收集

**reduce 规约:**可以将流中的元素反复结合起来,得到一个值

reduce 的使用:

@Test
    public void test3(){
//        Logger logger = new Logger(Test02.class);
        List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
        Integer result = list1.stream().reduce(0, (x, y) -> x + y);
        System.out.println(result);
        System.out.println("==================================");
        Optional<Integer> reduce = list.stream()
                .map(emp::getAge)
                .reduce(Integer::sum);
        System.out.println(reduce);
    }

收集:collect ===> 将流收集起来转成其他形势,.collect(Collectors.toList());

//List集合
    List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
        Integer result = list1.stream().reduce(0, (x, y) -> x + y);
        System.out.println(result);
        System.out.println("==================================");
        List<Integer> collect = list.stream()
                .map(emp::getAge)
                .collect(Collectors.toList());
        collect.forEach(System.out::println);
//        System.out.println(reduce);
        list.stream().map(emp::getName).collect(Collectors.toSet()).forEach(System.out::println);
        System.out.println("==========================lklm");
//迭代器
        HashSet<Integer> collect1 = list.stream().map(emp::getAge).collect(Collectors.toCollection(HashSet::new));
        Iterator<Integer> iterator = collect1.iterator();
        while (iterator.hasNext()) {
            Integer next = iterator.next();
            System.out.println("======" +  next);
        }
        System.out.println("===============================");
//增强for 循环
        for (Integer next : collect1) {
            System.out.println(next);
        }
        System.out.println("===============================");
//foreach 遍历
        collect1.forEach(System.out::println);
    }
 Map<emp.Status, List<emp>> map = list.stream().collect(Collectors.groupingBy(emp::getStatus));
        /**
         * map的遍历方法
         */
        //1 :迭代器
        Iterator<Map.Entry<emp.Status, List<emp>>> iterator1 = map.entrySet().iterator();
        while (iterator1.hasNext()) {
            Map.Entry<emp.Status, List<emp>> nextMap = iterator1.next();
            //emp.Status key = nextMap.getKey();
            System.out.println(nextMap);
        }
        System.out.println("???????????????????????????????????????????????????????????");
        //for 循环
        for (Map.Entry< emp.Status, List<emp>> entry : map.entrySet() ) {
            emp.Status key = entry.getKey();
            List<emp> value = entry.getValue();
            System.out.println(key+":"+value);
        }

时间:

Instant start = Instant.now();
Instant end = Instant.now();
System.out.println("一共花费了:" + Duration.between(start,end).getUnits());

Optional类:

避免空指针异常:

/**
     * OPtional容器类的常用方法:
     *           Optional.of(T, t) :创建一个Optional 类的实例
     *           Optional.empty()  :创建一个空的Optional类的实例
     *           Optional.ofNullable(T ,t) :若t不为空 , 则创建Optional实例 ,否则则创建空实例
     *
     *           isPresent()  : 判断是否包含值
     *           orElse(T t)  : 如果调用对象 包含值 ,则返回该值,否则返回  t
     *           orElseGet (Suppliser s)  :如果 如果调用对象 包含值 ,则返回该值,否则返回 s 获取的值
     *           map (Function  f) 如果有值对其进行处理,并返回先处理后的Optional  ,否则返回 Optional.empty()
     *           flapMap(Function mapper ) :与map相似 , 要求返回值必须是Optional
     */

接口中的默认方法和静态方法:

默认方法:default

类优先的原则:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IFbDSIu0-1665058647033)(C:\Users\12926\AppData\Roaming\Typora\typora-user-images\1658625445426.png)]

时间日期API

datetimeFormatter.ofpattern()

@Test
    public void test1() {
        // LocalDate   LocalTime   LocalDateTime
        LocalDateTime now = LocalDateTime.now();
        System.out.println(now);
        int year = now.getYear();
        System.out.println(year);
        System.out.println("================");
        LocalDateTime of = LocalDateTime.of(2022, 10, 8, 13, 33, 44);
        System.out.println(of);
        LocalDateTime localDateTime = of.plusYears(2);
        System.out.println(localDateTime);
    }
}

时间戳:(Unix 元年 :1970年1月1日 00:00 :00 到现在某个时间段之前的毫秒值)

Instant

@Test
    public void test2() {
        Instant now = Instant.now();
        System.out.println(now);
        System.out.println("=================");
        OffsetDateTime offsetDateTime = now.atOffset(ZoneOffset.ofHours(8));
        System.out.println(offsetDateTime);
    }
    @Test
    public void test3() throws InterruptedException {
        LocalDate now = LocalDate.now();
        Thread.sleep(1000000000L);
        LocalDate now1 = LocalDate.now();
        Period between = Period.between(now, now1);
        System.out.println(between.getDays());
    }

时间矫正器: TemporalAdjuster

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c2V1Kab7-1665058647034)(C:\Users\12926\AppData\Roaming\Typora\typora-user-images\1658629734818.png)]

DateTimeFotmatter :格式化时间日期

@Test
    public void test5() {
        DateTimeFormatter isoDateTime = DateTimeFormatter.ISO_DATE_TIME;
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd  HH:mm:ss");
        LocalDateTime now = LocalDateTime.now();
        String format = now.format(dateTimeFormatter);
        System.out.println(format);
    }
}

重复注解,类型注解

));

}

### 时间矫正器: TemporalAdjuster
[外链图片转存中...(img-c2V1Kab7-1665058647034)]
DateTimeFotmatter   :格式化时间日期
```java
 @Test
    public void test5() {
        DateTimeFormatter isoDateTime = DateTimeFormatter.ISO_DATE_TIME;
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd  HH:mm:ss");
        LocalDateTime now = LocalDateTime.now();
        String format = now.format(dateTimeFormatter);
        System.out.println(format);
    }
}

重复注解,类型注解


目录
相关文章
|
2月前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
78 2
|
2月前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
46 3
|
2月前
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
36 2
|
2月前
|
存储 算法 Java
Java Set因其“无重复”特性在集合框架中独树一帜
【10月更文挑战第14天】Java Set因其“无重复”特性在集合框架中独树一帜。本文深入解析Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定的数据结构(哈希表、红黑树)确保元素唯一性,并提供最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的`hashCode()`与`equals()`方法。
36 3
|
2月前
|
安全 Java API
Java 17新特性让你的代码起飞!
【10月更文挑战第4天】自Java 8发布以来,Java语言经历了多次重大更新,每一次都引入了令人兴奋的新特性,极大地提升了开发效率和代码质量。本文将带你从Java 8一路走到Java 17,探索那些能让你的代码起飞的关键特性。
93 1
|
2月前
|
编解码 Oracle Java
java9到java17的新特性学习--github新项目
本文宣布了一个名为"JavaLearnNote"的新GitHub项目,该项目旨在帮助Java开发者深入理解和掌握从Java 9到Java 17的每个版本的关键新特性,并通过实战演示、社区支持和持续更新来促进学习。
90 3
|
10天前
|
存储 Java 开发者
什么是java的Compact Strings特性,什么情况下使用
Java 9引入了紧凑字符串特性,优化了字符串的内存使用。它通过将字符串从UTF-16字符数组改为字节数组存储,根据内容选择更节省内存的编码方式,通常能节省10%至15%的内存。
|
19天前
|
存储 Java 数据挖掘
Java 8 新特性之 Stream API:函数式编程风格的数据处理范式
Java 8 引入的 Stream API 提供了一种新的数据处理方式,支持函数式编程风格,能够高效、简洁地处理集合数据,实现过滤、映射、聚合等操作。
35 6
|
1月前
|
分布式计算 Java API
Java 8引入了流处理和函数式编程两大新特性
Java 8引入了流处理和函数式编程两大新特性。流处理提供了一种声明式的数据处理方式,使代码更简洁易读;函数式编程通过Lambda表达式和函数式接口,简化了代码书写,提高了灵活性。此外,Java 8还引入了Optional类、新的日期时间API等,进一步增强了编程能力。这些新特性使开发者能够编写更高效、更清晰的代码。
33 4
|
2月前
|
存储 Java API
优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。
【10月更文挑战第19天】本文介绍了如何优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。内容包括Map的初始化、使用Stream API处理Map、利用merge方法、使用ComputeIfAbsent和ComputeIfPresent,以及Map的默认方法。这些技巧不仅提高了代码的可读性和维护性,还提升了开发效率。
95 3
下一篇
DataWorks