java8学习整理

简介: Lambda表达式只能简化函数式表达式接口(通常我们可以看到器有@functionalInterface注解)的匿名内部类写法,也即首先必须是接口,接着接口只能有一个抽象方法,此时可以考虑简化。Lambda表达式简化Comparator接口匿名内部类写法:进行数据排序,采用Comparator

由于项目中使用java8中的lambda表达式,因此想学习一下java8中的lambda表达式和stream流。

Lambda表达式的格式:

(匿名内部类被重写方法的形参列表)->{被重写方法的方法体代码}

例如:

publicclassLambdaDemo1 {
publicstaticvoidmain(String[] args) {
newThread(newRunnable() {
@Overridepublicvoidrun() {
System.out.println("线程任务执行!");
     }
   }).start();
  }
}

将其进行简化:

publicclassLambdaDemo1{
publicstaticvoidmain(String[] args){
Threadt=newThread(()->System.out.println("线程任务执行!")).start();
  }
}

Lambda表达式使用前提:

1)Lambda表达式并不能简化所有匿名内部类的写法2)Lambda表达式只能简化接口中只有一个抽象方法的匿名内部类形式

Lambda表达式只能简化函数式表达式接口(通常我们可以看到器有@functionalInterface注解)的匿名内部类写法,也即首先必须是接口,接着接口只能有一个抽象方法,此时可以考虑简化。

Lambda表达式简化Comparator接口匿名内部类写法:进行数据排序,采用Comparator

publicclassLambdaDemo1 {
publicstaticvoidmain(String[] args) {
List<Student>lists=newArrayList<>();
Students1=newStudent("小花",16,"女");
Students2=newStudent("小红",18,"女");
Students3=newStudent("小乐",20,"男");
collections.addAlls(lists,s1,s2,s3);
//按年龄排序collections.sort(lists,newComparator<student>(){
@Overridepublicintcompare(Students1,Students2){
returns1.getAge()-s2.getAge();
          }
      });
System.out.println("===排序后的集合==="+lists);
privateStringname;
privateintage;
privateStringsex;
//省略get/set  }
}

对上面的进行改写,将匿名方法的形参列表列出来,同时将将箭头指向被重写的方法:

publicclassLambdaDemo1 {
publicstaticvoidmain(String[] args) {
List<Student>lists=newArrayList<>();
Students1=newStudent("小花",16,"女");
Students2=newStudent("小红",18,"女");
Students3=newStudent("小乐",20,"男");
collections.addAlls(lists,s1,s2,s3);
//按年龄排序collections.sort(lists, (Students1,Students2)->{
returns1.getAge()-s2.getAge();
      });
System.out.println("===排序后的集合==="+lists);
privateStringname;
privateintage;
privateStringsex;
//省略get/set  }
}

按理说,改写上面这样就可以了,但Lambda表达式的省略写法在此基础上进行了进一步简化:

1)如果lambda表达式的方法体代码只有一行代码,可以省略大括号不写,同时要省略分号2)如果lambda表达式的方法体代码只有一行代码,可以省略大括号不写,此时如果这行代码是return语句,必须省略return不写,同时必须省略“;”不写3)参数类型可以省略不写4)如果只有一个参数,参数类型可以省略,同时()也可以省略

也就是说上面的代码只有一行,我们可以进一步改写,首先去掉大括号,去掉分号,看到说明(2),我们需要去掉return,同时分号去掉,再接着省略参数类型:

publicclassLambdaDemo1 {
publicstaticvoidmain(String[] args) {
List<Student>lists=newArrayList<>();
Students1=newStudent("小花",16,"女");
Students2=newStudent("小红",18,"女");
Students3=newStudent("小乐",20,"男");
collections.addAlls(lists,s1,s2,s3);
//按年龄排序//return collections.sort(lists, (Student s1,Student s2)->s1.getAge()-s2.getAge());//collections.sort(lists, (Student s1,Student s2)->s1.getAge()-s2.getAge());//从而可以将其简化collections.sort(lists, (s1,s2)->s1.getAge()-s2.getAge());
System.out.println("===排序后的集合==="+lists);
privateStringname;
privateintage;
privateStringsex;
//省略get/set  }
}

对forEach的简化:

publicstaticvoidmain(String[] args){
List<String>names=newArrayList<>();
names.add("ab");
names.add("bc");
names.add("xiao");
nams.forEach(newComsumer<String>(){
@Overridepublicvoidaccpet(Strings){
System.out.println(s);
  }
});
}

进行改写:

publicstaticvoidmain(String[] args){
List<String>names=newArrayList<>();
names.add("ab");
names.add("bc");
names.add("xiao");
//首先对其进行形参进行提取,再进行方法指向//nams.forEach((String s)->{//   System.out.println(s);//});//接着进行大括号去掉,分号去掉,去掉类型//nams.forEach((String s)->System.out.println(s));////nams.forEach((s)->System.out.println(s));//接着进行进一步改写,从改写第4条,我们知道参数只有一个时,可以不写,也是最简方案nams.forEach(System.out::println);  
}

Stream流的一些学习

筛选操作:

publicstaticvoidmain(String[] args){
//需求:从集合中筛选出现所有长度为3,且姓张的同志,同时对同名同姓的进行虑重List<String>list=newArrayList<>();
list.add("张三");
list.add("张随和");
list.add("张随和");  
list.add("张思通");
list.add("刘倩");
list.add("冠宏");
//首先筛选长度为3,接着筛选张姓的,接着进行获取  list.stream().filter(s->s.length==3)
    .filter(s->s.startWith("张")).distinct().forEach(System.out::println);  
}

Stream流中筛选操作

从菜肴menu中获取菜肴dish的名称dishName

List<String> list = dish.stream().map(Dish::getName).collect(toList());

从菜肴中获取菜肴的名称,同时对大于300g的进行筛选

List<String>list=dish.stream().map(Dish::getName).filter(s->s.weight>300).collect(toList());

从菜肴中获取菜肴的名称,同时对大于300g的进行筛选,同时根据菜的类型进行分组

Map<Dish.type,List<Dish>> mapList = dish.stream().map(Dish::getName)
.filter(s->s.weight>300).collect(groupingBy(Dish::type));
目录
相关文章
|
1月前
|
编解码 Oracle Java
java9到java17的新特性学习--github新项目
本文宣布了一个名为"JavaLearnNote"的新GitHub项目,该项目旨在帮助Java开发者深入理解和掌握从Java 9到Java 17的每个版本的关键新特性,并通过实战演示、社区支持和持续更新来促进学习。
79 3
|
1月前
|
XML Java 编译器
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
88 43
Java学习十六—掌握注解:让编程更简单
|
18天前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
1月前
|
存储 SQL 小程序
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
这篇文章详细介绍了Java虚拟机(JVM)的运行时数据区域和JVM指令集,包括程序计数器、虚拟机栈、本地方法栈、直接内存、方法区和堆,以及栈帧的组成部分和执行流程。
33 2
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
|
25天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
1月前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
45 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
1月前
|
前端开发 Java 应用服务中间件
Javaweb学习
【10月更文挑战第1天】Javaweb学习
33 2
|
1月前
|
存储 安全 Java
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
25 3
|
1月前
|
存储 安全 Java
【用Java学习数据结构系列】探索栈和队列的无尽秘密
【用Java学习数据结构系列】探索栈和队列的无尽秘密
31 2
|
1月前
|
存储 Java 编译器
【用Java学习数据结构系列】初识泛型
【用Java学习数据结构系列】初识泛型
20 2
下一篇
无影云桌面