首页 > 编程语言 >java基础day17:java8常用新特性

java基础day17:java8常用新特性

时间:2024-11-25 16:59:59浏览次数:9  
标签:java stream Thread System day17 println Optional java8 out

一、Lambda表达式

Lambda表达式就是匿名函数,匿名函数可以作为参数传递,表示数据。目的是让代码更加简洁,开发更高效!

(参数1,参数2...)->{函数体} 特点: ​ 参数的类型可以不写,Lambda表达式可以根据上下文进行推断

函数体如果只有一行代码,大括号可以不写。

如果只有一行代码并是作为返回值使用,则return可以不写

lambda表达式与函数式接口绑定出现

案例:

public class Demo1 {
    public static void main(String[] args) {
//        MyThread myThread = new MyThread();
//        Thread thread = new Thread(myThread);
//        thread.start();
​
        //匿名内部类
//        Thread thread = new Thread(new Runnable() {
//            @Override
//            public void run() {
//                System.out.println("倒数:3");
//                try {
//                    Thread.sleep(2000);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }    System.out.println("倒数:2");
//                try {
//                    Thread.sleep(2000);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }    System.out.println("倒数:1");
//                try {
//                    Thread.sleep(2000);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//            }
//        });
//
//        thread.start();
//
        //Lambda表达式
​
       Thread thread= new Thread(() ->{
                System.out.println("倒数:3");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }    System.out.println("倒数:2");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }    System.out.println("倒数:1");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            
        });
       thread.start();
​
    }
}
​
/*
​
class MyThread implements Runnable{
    @Override
    public void run() {
        System.out.println("倒数:3");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }    System.out.println("倒数:2");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }    System.out.println("倒数:1");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
​
    }
}*/
案例2:参数根据上下文自动推算
    //参数x和y的类型进行了自动推算
    MyLambdaTest myLambdaTest = (x, y)->x+y;    //()->{return x+y;}
​
    interface MyLambdaTest{
        default void printName(){
            System.out.println(this.getClass().getName());
        }
​
        int sum(int a, int b);
    }

二、函数式接口

1、特点: 只包含一个抽象方法的接口就是函数式接口。 如果需要将接口设置为函数式接口,可以在接口上添加注解: @FunctionalInterface

2、函数式接口分类 jdk内置的函数式接口: java.util.function:(Function、Consumer、Supplier、Predicate)

函数型接口:有输入参数,也有返回值。Function 案例:

Function<String, Integer> fumc = (x)->x.length();
​
    Integer nihao = fumc.apply("nihao");
    System.out.println(nihao);

消费型接口:有参数,没有返回值。Consumer 供给型接口:没有参数,有返回值。Supplier 断言型接口:有输入参数,也有返回值,返回boolean类型。 Predicate

补充案例:java支持不定长参数

public static void nums(int ... n){
 //System.out.println(n instanceof int[]);
 int sum = 0; for (int num:n) { 
sum+=num; 
} 
System.out.println("所有数值的总和是:"+sum); }

三、方法引用和构造引用

1、方法引用

当要传递给Lambda体的操作已经有实现方法,可以直接使用方法引用 写法: 对象/类::方法名 //仅仅是引用但不执行

案例:
 
   lambda:
    Consumer<String> consumer = (x)-> System.out.println(x);
    consumer.accept("hello world");
​
    lambda+函数引用:
    Consumer<String> consumer = System.out::println;    //此处只是引用out对象的println方法,而不是调用
    consumer.accept("hello world");

2、构造引用 //普通构造引用

Supplier<Students> students = Students::new;
students.get().printClassInfo();
​
class Students{
    public void printClassInfo(){
        System.out.println(this.getClass().getName());
    }
}
​
//数组构造引用
  //可以传递一个参数(表示数组长度),返回数组对象,通过相应类型的构造引用创建对象。
  Integer[] arr = new Integer[5];
  Function<Integer, Integer[]> integersFunc = (len)->new Integer[len];
  //Integer数组的构造引用
  Function<Integer, Integer[]> integersFunc1 = Integer[]::new;
  Integer[] apply = integersFunc1.apply(6);
  System.out.println(Arrays.toString(apply));

四、Stream(流) API

1、定义

jdk1.8提供的一种数据流水线的处理API。

2、特点

        1.stream不会存储数据

        2.stream在处理完成后会返回一个持有新数据的stream对象

        3.stream中存在持续执行和终止执行的方法(迟现象)

3、流处理中的持续执行(中间方法)和终止方法

1-中间方法:(流水线的一个操作,不会导致流程结束)

map (mapToInt,flatMap 等)filter、 distinct、sorted、 peek、limit、skip、parallel、sequential、unordered

2-终止方法:(调用后,流程结束)

forEach、forEachordered、toArray、reduce、allMatch、collect、min、maX、count、anyMatch、noneMatch、findrirst、findAny、iterator

案例1:将流中的数据进行foreach遍历

int[] ints={12,25,66,71,45,99};
​
IntStream   stream=Arrays.stream(ints);stream.forEach(System.out::println);

案例2:通过中间方法filter过滤数据集中的大于等于60分的值

stream.filter((a)->(a>=60)?true:false).forEach(System.out::println);

4、如何将数据集转化为stream

数组 Arrays工具类中的stream方法
集合集合类身上具有stream方法
Stream自带的方法Stream.of(T ... data)

五、接口中的默认方法和静态方法

默认方法: 被default修饰的方法。 ​

六、日期时间API

LocalDate; //日期 ​ LocalTime; //时间 ​ LocalDateTime; //日期时间

案例:
    
 //获取当前时间
      LocalDateTime now = LocalDateTime.now();
      //System.out.println(now.toString());
​
      //日期时间格式化输出
      String format = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
      System.out.println(format);
​
      //5天之后的日期
      LocalDateTime localDateTime = now.plusDays(5);
      System.out.println(localDateTime.toString());
​
      //计算两个日期之间相差的天数
      //创建未来某个日期的对象: 2023-1-15 10:00:00
      LocalDateTime parse = LocalDateTime.parse("2023-01-15T10:00:00");
​
      long until = Math.abs(parse.until(now, ChronoUnit.DAYS));
      System.out.println(until);

七、OPtional(重要)

1、定义

​ OPtional是一个数据容器,可以更好的表达数据是否存在的状态,对空指针可控。

2、常用方法

Optional.of(T t):创建一个Optional实例;

Optional.ofNullable(T t):若t不为空创建一个Optional实例否则创建一个空实例;
​
Optional.empty():创建一个空的Optional实例;
​
isPresent():判断是否包含值;
​
orElse(T t):如果调用对象包含值,返回该值,否则返回t;
​
orElseGet(Supplier s):如果调用对象包含值,返回该值,否则返回s获取的值;
​
map(Function f):如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty();
​
flatMap(Function mapper):与map类似,要求返回值必须是Optional。

案例:避免空指针问题

String str = null;
    //Optional 控制空指针,避免程序运行时由于异常导致终止
    Optional<String> str1 = Optional.ofNullable(str);
    System.out.println(str1.orElse("").length());

标签:java,stream,Thread,System,day17,println,Optional,java8,out
From: https://blog.csdn.net/weixin_62189092/article/details/144030938

相关文章

  • 计算机毕业设计必看必学03361springboot开放实验室管理系统原创定制程序,java、PHP、p
    springboot开放实验室管理系统摘要随着社会的发展,社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是使用动态网页开发技术java作为系统的开发语言,MySQL作为后台数据......
  • 计算机毕业设计必看必学35702+springboot电影推荐系统原创定制程序,java、PHP、python
                                                              摘 要随着互联网与移动互联网迅速普及,网络上的电影娱乐信息数量相当庞大,人们对获取感兴趣的电影娱乐信息的需求越来越大,个性化的电影推荐系统成......
  • [Javascript] Import the Same JavaScript Module Multiple Times with Cache Busting
    WhenattemptingtoloadthesamemoduletwiceinJavaScriptyou'llhitacacheandcodewon'tre-run.Inscenarioswhereyouactuallydowanttohavestateinyourmodules,you'llhavetouseacache-bustingtechniquebypassingaquerypar......
  • 【Z2400010】基于java+ssm+mysql+layui的学籍管理系统的设计与实现(附源码 配置 文档)
    基于ssm+layui的学籍管理系统1.摘要2.系统功能3.系统数据库4.界面展示5.源码获取1.摘要本系统是一个基于SSM(Spring+SpringMVC+MyBatis)框架和Layui前端框架的学籍管理系统,旨在帮助新手快速上手JavaWeb项目的整体运行流程,并熟悉此类项目的搭建过程。系统界面简洁明......
  • java反射笔记
    packagetest1125;publicclassclassTest{publicstaticvoidmain(String[]args){try{//获取Class对象的三种方式System.out.println("根据类名:\t"+User.class);System.out.println("根据对象:\t"......
  • javascript-语句
    1.对象时不可迭代访问的。尝试使用for/of循环会throwTypeErrorleto={x:1,y:2,z:3};for(letelementofo){console.log(element);}//throwtypeError2.可以使用Object.keys()方法实现对象迭代leto={x:1,y:2,z:3};letkeys="";for(letkofObject.keys(o)){keys+=k;}......
  • Java NIO(io模型,三大组件,网络编程)
    一、NIOJavaNIO(NewI/O,新的输入输出)是Java1.4引入的一套I/O库,相比传统的IO(字节流和字符流),它主要用于处理高效的、非阻塞的I/O操作,特别是在需要处理大规模数据或高并发的场景中表现突出。JavaNIO提供了非阻塞模式、内存映射文件、缓冲区等一系列增强功能,适用于现代的高......
  • 免费送源码:Java+ssm+MySQL 社区干洗店服务微信小程序 计算机毕业设计原创定制
    目 录摘要11绪论11.1意义11.2课题背景11.3node.js主要功能11.4node.js功能模块11.5论文结构与章节安排12社区干洗店服务微信小程序系统分析32.1可行性分析32.2系统流程分析32.2.1数据增加流程32.3.2数据修改流程42.3.3数据删除流程42.3系......
  • (免费送源码)计算机毕业设计原创定制:Java+ B/S+JSP+ springboot 基于SpringBoot的健康管
    摘 要随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,健康管理系统被用户普遍使用,为方便用户能够可以随时进行健康管理系统的数据信息管理,特开发了基于springboot的健康管理系......
  • 计算机毕业设计原创定制(免费送源码):Javaspringboot++MySQL springboot 社区互助服务管
    摘 要随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受居民的喜爱,社区互助服务管理系统小程序被居民普遍使用,为方便居民能够可以随时进行社区互助服务管理系统小程序的数据信息管理,特开发......