Java SE : java8新特性(下)

简介: Java SE : java8新特性(下)

@Test
public void test24(){
    //去掉所有的重复数字 且 只留偶数
    //中间加工处理绝不仅仅只能写一步,它可以写很多步
    Stream.of(1,2,3,4,5,2,4,6,5,3,1) //创建流
            .distinct()  //中间加工处理
            .filter(t-> t%2==0) //中间加工处理
            .forEach(t-> System.out.print(t+"\t")); //终结操作
}

@Test
public void test25(){
    //在初始元素为1,元素累加2的无限流中,取前10个
    Stream.iterate(1,t->t+2)
            .limit(10)//取无限流中前10个
            .forEach(System.out::println);
}

@Test
public void test26(){
    //在初始元素为1,元素累加2的无限流中,跳过前10个,并只取前10个
    Stream.iterate(1,t->t+2)
            .skip(10)//跳过无限流中前10个
            .peek(t->{  //数据每隔200ms出现一次,使之不要出现的那么的快
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            })
            .limit(10) //只取前10个
            .forEach(System.out::println);
}

@Test
public void test27(){
    //统计这组数据中的偶数个数,是不重复的偶数,并且要打印出来
    long count=Stream.of(1,2,3,4,5,2,4,6,5,3,1) //创建流
            .filter(t -> t%2==0)  //  过滤偶数  中间加工处理
            .distinct()  //去重复
            .peek(t-> System.out.print(t+"\t")) //中间加工
            .count();
    System.out.println();
    System.out.println("偶数个数:"+count);
}

@Test
public void test28(){
    //从小到大排序
    Stream.of(1,5,2,89,45,32,9,12)  //创建流
            .sorted()  //中间加工 排序
            .forEach(System.out::println); //终结
}

@Test
public void test29(){
    ArrayList<Student> list=new ArrayList<>();
    list.add(new Student("kfc"));
    list.add(new Student("dragon"));
    //按照名字排序
    list.stream()  //创建流
            .sorted((s1,s2)-> s1.getName().compareTo(s2.getName()))//中间加工 排序
            .forEach(t -> System.out.println(t)); //终结
}

@Test
public void test30(){
    //将原来流中的数据变成它的2倍并打印
    Stream.of(1,2,3,4,5)//创建流
            .map(t-> t*2) //中间加工
            .forEach(System.out::println); //终结
}

@Test
public void test31(){
    //取出单词的首字目
    Stream.of("hello","world","java")
            .map(t -> t.charAt(0) )
            .forEach(System.out::println);
}

@Test
public void test32(){
    //把字符串每个字符串起来,变成一个新的流
   /*
    <R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);
    Function<TR>是功能型函数式接口 抽象方法 R apply(T t)
        T:  ? super T
        R : ? extends Stream?extends R> 说明function函数使用后,apply方法结果要是一个stream对象
    <R> Stream<R> map(Function<? super T, ? extends R> mapper);
        T: ? super T
        R: ? extends R
    */
    Stream.of("hello","world","java")
            .flatMap( t-> {
                char[] chars = t.toCharArray();
                Character[] c = new Character[chars.length];
                for (int i = 0; i < chars.length; i++) {
                    c[i] = chars[i];
                }
                return Arrays.stream(c);
            })
            .forEach(System.out::println);
}

(3) 终结操作,它的方法的返回值不再是一个流,而是其他的类型

注意:

中间加工处理的方法返回值结果仍然是stream类型。

终结操作处理的方法返回值结果就不再是stream类型。表示之后无法再进行流处理。

具体的方法:

方法 描述
booleanallMatch(Predicate p) 检查是否匹配所有元素
booleananyMatch(Predicate p) 检查是否至少匹配一个元素
booleannoneMatch(Predicate p) 检查是否没有匹配所有元素
OptionalfindFirst() 返回第一个元素
OptionalfindAny() 返回当前流中的任意元素
longcount() 返回流中元素总数
Optionalmax(Comparator c) 返回流中最大值
Optionalmin(Comparator c) 返回流中最小值
voidforEach(Consumer c) 迭代
Treduce(T iden, BinaryOperator b) 可以将流中元素反复结合起来,得到一个值。返回 T
Ureduce(BinaryOperator b) 可以将流中元素反复结合起来,得到一个值。返回 Optional
Rcollect(Collector c) 将流转换为其他形式。接收一个 Collector接口的实现,用于给Stream中元素做汇总的方法

代码演示如下:

@Test
public void test33(){
    //判断是否全部为奇数
   boolean b= Stream.of(1,2,3,4,5,2,4,6,5,3,1)//创建流
            .allMatch(t -> t%2!=0); //终结
    System.out.println("是否全部为奇数:"+b);
}

@Test
public void test34(){
    Optional<Integer> first = Stream.of(1, 2, 3, 4, 5, 2, 4, 6, 5, 3, 1)//创建流
            .findFirst(); //终结
    System.out.println("第一个:"+first);
}
@Test
public void test35(){
    //对于稳定的流(元素稳定且固定),findAny() 等价于 findFirst()
    Optional<Integer> any = Stream.of(1, 2, 3, 4, 5, 2, 4, 6, 5, 3, 1)//创建流
            .findAny(); //终结
    System.out.println("第一个:"+any);
}

@Test
public void test36(){
    //随机产生10个【0-100】的整数,找出最大值
    Optional<Integer> max= Stream.generate(() -> (new Random().nextInt(101)))
            .limit(10)
             .peek(t-> System.out.print(t+"\t"))
                .max(Integer::compareTo);
    System.out.println(max);
}

@Test
public void test37(){
    //累加和
    /*
    Optional<T> reduce(BinaryOperator<T> accumulator);
    public interface BinaryOperator<T> extends BiFunction<T,T,T>
    public interface BiFunction<T,U,R> 的抽象方法 R apply(T t,U u);
    BinaryOperator接口的抽象方法 T apply(T t,T u);
    */
    Optional<Integer> reduce = Stream.of(1, 2, 3, 4, 5)
            .reduce((t1, t2) -> t1 + t2);
    System.out.println(reduce);
}

@Test
    public void test38(){
/*        ColLector 接口中方法的实现决定了如何对流执行收集的操作(如收集到 List、Set、Map)。
        另外, CoLLectors 实用类提供了很多静态方法,可以方便地创建常见收集器实例。*/
        ArrayList<String> list=new ArrayList<>();
        list.add("jack");
        list.add("hello");
        list.add("world");
        list.add("java");
        Set<String> a = list.stream()
                .filter(s -> s.contains("a"))
                .peek(s -> System.out.println(s))
                .collect(Collectors.toSet());
        System.out.println("list:"+list);
        System.out.println("set:"+a);
    }


十二.Optional 类

12.1 为什么要引入Optional类?

原因:

Java很多方法的返回值 (更多是返回值)

或形参是引用数据类型时,返回null。对方拿到这个数据时,没有做非空判断的话,会发生空指针异常。或者说是加非空判断f (xx !=

null)使得代码很臃肿。

引入了optional类来尽量的降低空指针异常的风险,又可以简化代码。

12.2 Optional类特点

(1) 它是一个容器

(2) 只包含一个对象的容器

12.3 如何使用它?

12.3.1 创建它

static Optional empty(): 得到一个空的容器对象,里面没有元素,容器对象有。staticOptionalof(T value) : 得到一个包含元素的容器对象,里面一定有元素,而且非null

代码演示如下:

@Test
public void test01(){
    Optional<Object> empty = Optional.empty();
    System.out.println(empty);
    Optional<String> java = Optional.of("java");
    System.out.println(java);
    Optional<Object> o = Optional.of(null);
    System.out.println(o);
}

static Optional ofNullable(T value) : 得到一个包含元素的容器对象,里面一定有元素,元素可以是非null。可以是null

代码演示如下:

@Test
public void test02(){
    String str=null;
    Optional<String> str1 = Optional.ofNullable(str);//允许为null
    System.out.println(str1);
}

12.3.2 取出容器中的数据

T get(): 要求容器中必须有一个非空对象

T orELse(T other) : 如果容器中有非空对象,就取容器中非空对象,如果没有,就用other备胎。

代码演示如下:

@Test
    public void test03(){
        Optional<Integer> maxOptional = Stream.of(1, 3, 5, 7, 9)
                .filter(t -> t % 2 == 0)
                .max(Integer::compareTo);
//        Integer integer = maxOptional.get();//java.util.NoSuchElementException: No value present  maxOptional里值为空
        Integer max = maxOptional.orElse(0);
        System.out.println(max);
    }

T orELseget(Supplier<? extends T>other): 如果容器中有非空对象,就取容器中非空对象,如果没有,就用Supplier接口提供的对象代替

代码演示如下:

@Test
    public void test04(){
        Random random=new Random();
        Optional<Integer> maxOptional = Stream.of(1, 3, 5, 7, 9)
                .filter(t -> t % 2 == 0)
                .max(Integer::compareTo);
//        Integer integer = maxOptional.get();//java.util.NoSuchElementException: No value present  maxOptional里值为空
        Integer max = maxOptional.orElseGet(() -> random.nextInt(100)); //若无偶数,则返回一个100以内的随机整数
        System.out.println(max);
    }

T orElseThrow(Supplier<? extends X> exceptionSupplier) :

如果Optional容器中非空,就返回所包装值,如果为空,就抛出你指定的异常类型代替原来的NoSuchElementException

代码演示如下:

@Test
    public void test05(){
        Random random=new Random();
        Optional<Integer> maxOptional = Stream.of(1, 3, 5, 7, 9)
                .filter(t -> t % 2 == 0)
                .max(Integer::compareTo);
//        Integer integer = maxOptional.get();//java.util.NoSuchElementException: No value present  maxOptional里值为空
        Integer max = maxOptional.orElseThrow(() -> new RuntimeException("没有最大值")); //没有偶数,就抛出里面的异常
        System.out.println(max);
    }

12.3.3 其他

boolean isPresent() : 判断容器中有没有元素

void ifPresent(Consumer<? super T> consumer) : 如果存在就执行xx代码

代码演示如下:

@Test
    public void test06(){
        Optional<Integer> maxOptional = Stream.of(1, 3, 5, 7, 9)
                .filter(t -> t % 2 == 0)
                .max(Integer::compareTo);
//        Integer integer = maxOptional.get();//java.util.NoSuchElementException: No value present  maxOptional里值为空
        maxOptional.ifPresent(s -> System.out.println(s)); //若有最大的偶数,就打印,没有就什么都不打印
    }

相关文章
|
2月前
|
Java API 数据处理
Java新特性:使用Stream API重构你的数据处理
Java新特性:使用Stream API重构你的数据处理
|
2月前
|
安全 Java API
Java SE 与 Java EE 区别解析及应用场景对比
在Java编程世界中,Java SE(Java Standard Edition)和Java EE(Java Enterprise Edition)是两个重要的平台版本,它们各自有着独特的定位和应用场景。理解它们之间的差异,对于开发者选择合适的技术栈进行项目开发至关重要。
395 1
Java API 开发者
99 0
|
4月前
|
并行计算 Java API
Java List 集合结合 Java 17 新特性与现代开发实践的深度解析及实战指南 Java List 集合
本文深入解析Java 17中List集合的现代用法,结合函数式编程、Stream API、密封类、模式匹配等新特性,通过实操案例讲解数据处理、并行计算、响应式编程等场景下的高级应用,帮助开发者提升集合操作效率与代码质量。
219 1
|
4月前
|
安全 Java 微服务
Java 最新技术和框架实操:涵盖 JDK 21 新特性与 Spring Security 6.x 安全框架搭建
本文系统整理了Java最新技术与主流框架实操内容,涵盖Java 17+新特性(如模式匹配、文本块、记录类)、Spring Boot 3微服务开发、响应式编程(WebFlux)、容器化部署(Docker+K8s)、测试与CI/CD实践,附完整代码示例和学习资源推荐,助你构建现代Java全栈开发能力。
537 1
|
4月前
|
缓存 安全 Java
Java 并发新特性实战教程之核心特性详解与项目实战
本教程深入解析Java 8至Java 19并发编程新特性,涵盖CompletableFuture异步编程、StampedLock读写锁、Flow API响应式流、VarHandle内存访问及结构化并发等核心技术。结合电商订单处理、缓存系统、实时数据流、高性能计数器与用户资料聚合等实战案例,帮助开发者高效构建高并发、低延迟、易维护的Java应用。适合中高级Java开发者提升并发编程能力。
139 0
|
4月前
|
安全 Java API
Java 17 及以上版本核心特性在现代开发实践中的深度应用与高效实践方法 Java 开发实践
本项目以“学生成绩管理系统”为例,深入实践Java 17+核心特性与现代开发技术。采用Spring Boot 3.1、WebFlux、R2DBC等构建响应式应用,结合Record类、模式匹配、Stream优化等新特性提升代码质量。涵盖容器化部署(Docker)、自动化测试、性能优化及安全加固,全面展示Java最新技术在实际项目中的应用,助力开发者掌握现代化Java开发方法。
209 1
|
1月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
143 1
|
1月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
160 1
|
2月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
下一篇
oss云网关配置