java 第19天 Lambda、jdk8.0新方法、Optional

一.Lambda表达式

前提是:参数是函数式接口才可以书写Lambda表达式

函数式接口条件: 1.接口 2.只有一个抽象方法

lambda表达式又称为匿名函数,允许匿名函数以参数的形式传入方法,简化代码

lambda表达式分为两部分()->{}

():要被覆盖的抽象方法的参数列表

如果参数只有一个的话()可以省略

{}:要被覆盖的抽象方法的方法体

如果方法体中只有一条语句{}和; 和 return省略

lambda中的return取决于抽象方法的返回类型

以下是关于lambda表达式的练习

(1.)TreeSet的一个构造方法可以使用 如下

TreeSet<>(Comparator接口 有一个抽象方法 compare(T x,T y));

java 复制代码
		TreeSet<Integer> set = new TreeSet<>((x, old)->old - x);
		Collections.addAll(set,45,23,100,98);

(2).Collections.sort(list,Comparator) 也可以使用

java 复制代码
		ArrayList<Integer> list=new ArrayList<>();
		Collections.addAll(list,45,23,100,98);
		//对list按照个位数升序
		/*Collections.sort(list,(n,old)->{
			return n%10-old%10;
		});*/
		Collections.sort(list,(n,old)->n%10-old%10);

(3)Collections.min(list,Comparator) 根据名字长度升序并且拿到第一个元素

java 复制代码
Student stu=Collections.min(set,(n,old)->{return n.getName().length()-old.getName().length();});
Student stu=Collections.min(set,(n,old)-> n.getName().length()-old.getName().length());
		System.out.println(stu);

二.JDK8.0 新方法

(1.)对于list集合的

list.sort(Comparator<>); 可在比较器中设置比较规则 也可用lambda表达式 如下

其中里面的x.compareTo是泛型自身的比较规则

java 复制代码
list.sort((x,y)->{return x.compareTo(y);});

总结对list的排序

List 去排序
Collections . sort ( List )
Collections . sort ( List , Comparator )
list . sort ( Comparator )
TreeSet set = new TreeSet ( List 对象 );

(2)Collection提供

forEach(Consumer):

单值集合对象 . forEach (( x ) -> { 逻辑 });

引入了四大接口之一的-----------消费型接口 只会进去 不会出来返回类型void

接口:interface Consumer<泛型>()
唯一的抽象方法: void accept(泛型 x);
使用如下:
获取学生的年龄 并且加1

java 复制代码
		set.forEach((stu)->{
			stu.setAge(stu.getAge()+1);
		});
java 复制代码
	set.forEach((temp)->{
			temp.setScore(temp.getScore()+5);

		});

所谓的forEach中的小括号就是拿出集合中每一个数据罢了,如果是学生集合,对应的拿出的就是单独一个学生

removeIf(Predicate):删除集合里面所有符合条件的元素 调用如下

单值集合对象.removeIf( (x)->{return 条件判断;})

四大接口之一---断言型接口

接口:interface Predicate<T >{}

唯一的抽象方法: boolean test(泛型 x);

练习removeIf,符合条件的就删除了

javascript 复制代码
		//删除20岁的Jacker
		set.removeIf((temp)->{
			return temp.getName().equals("Jacker")&&temp.getAge()==20;
		});

(3).为map提供的方法

forEach(BiConsumer) 拿出集合中的每个对象进行某种操作

map.forEach((key,value)->{逻辑});

三.方法的引用

jdk8.0的新语法 对lambda表达式进行了进一步简化

之前

对象.实例方法()

对象.静态方法()

类名.静态方法()

new 构造方法()

可以被一下替换

【对象::实例方法】

必须同时满足的两个条件
1 要被覆盖的抽象方法的参数列表和实例方法的参数列表一致
2 要被覆盖的抽象方法的返回类型和实例方法的返回类型一致

java 复制代码
		// 抽象方法:void accept(Integer)
		// 实例方法:void println(Integer)

		list.forEach(System.out::println);
		// list.forEach((x)->System.out.println(x));

但是下面的不行

java 复制代码
		Map<String,Integer> map = new HashMap<>();
		map.put("黄一亿",59);
		map.put("可可可",59);

// 1 要被覆盖的抽象方法的参数列表和实例方法的参数列表一致
// 2 要被覆盖的抽象方法的返回类型和实例方法的返回类型一致
		// 抽象方法:void accept(String,Integer)
		// 实例方法:void println(String)
		// 1 X 2 √
		map.forEach((k,v)->System.out.println(k+v));

【类名::实例方法】

必须同时满足的三个条件
1 要被覆盖的抽象方法的参数列表比实例方法的参数列表多一个
2 要被覆盖的抽象方法的第一个参数可以调用实例方法
3 要被覆盖的抽象方法的返回类型和实例方法的返回类型一致

java 复制代码
		//抽象方法: int compare(Student x,Student y)
		//实例方法; int compareTo(Student y)
		//11.抽象方法的参数比实例方法多一个
		//22.抽象方法的第一个 参数可以调用---升序可以 降序不OK
		//33.抽象方法的返回类型和实例方法的返回类型一致
		//1 √ 2 √ 3.√
		list.sort((x,y)->{return x.compareTo(y);});
		list.sort(Student::compareTo);

类名::静态方法

【构造方法::new】

1 要被覆盖的抽象方法的参数列表和构造方法的参数列表一致
2 要被覆盖的抽象方法的返回类型和构造方法的返回类型一致

java 复制代码
		Student stu = null;
		stu = Optional.ofNullable(stu) // Optional<Student>
			// 构造方法:Student Student()
			// 抽象方法:Student get()
			// 参数列表一致
			// 返回类型一致
			// 构造方法::new
			// .orElseGet(()->new Student());
			.orElseGet(Student::new);
		System.out.println(stu);

四.Optional****容器类

jdk8.0之后出现的致力于解决空指针问题
首先认识of(元素)---认识不掌握 不好用一点都不好
of( 元素 )
如果元素非空 直接返回包含元素的 Optional 对象
如果元素是 null 直接空指针
get()--------------------------------垃圾 不掌握
如果容器不是空容器 取出容器中的元素
如果容器是空容器 Optional.empty 直接报错【 NoSuchElementException 】
【结合 isPresent() 使用】
【 isPresent() 不是空容器 -true Optional.empty-false 】
ifPresent ( Consumer )
如果容器非空 会调用匿名函数
如果容器时 Optional . empty 不执行匿名函数

对于元素的放用ofNullable---以下掌握

ofNullable( 元素 )
如果元素非空 直接返回包含元素的 Optional 对象
如果元素为空 直接返回 Optional.empty 空元素

java 复制代码
        String str = "hello";
		Optional<String> op = Optional.ofNullable(str);
		System.out.println(op); 打印 hello

		String str = null;
		Optional<String> op = Optional.ofNullable(str);
		System.out.println(op);  打印Optional.empty

搭配上取

orElse(类型 x) x => 如果Optional.empty 使用x

如果容器非空 直接返回容器中的内容
使用如下:
如果str为空则为 no value,不为空则为原来值

java 复制代码
str = Optional.ofNullable(str).orElse("No Value");

orElseGet(Suppler<T> ss)

orElseGet (() -> { return xxx ;})
如果容器非空 直接返回容器中的内容
如果 Optional . empty 使用 x 调用匿名函数【 lambda 的版本】
区别: orElseGet 惰性执行

四大接口之一----供给型接口 只提供 不接收

接口: interface Supplier< 泛型 >{}
唯一的抽象方法:泛型 get()

java 复制代码
        String str = null;
		str = Optional.ofNullable(str)// Optional<String>
			// 抽象方法:String get()
			.orElseGet(()->"No Value");
		System.out.println(str);

类名::构造方法

java 复制代码
		Student stu = null;
		stu = Optional.ofNullable(stu) // Optional<Student>
			// 构造方法:Student Student()
			// 抽象方法:Student get()
			// 参数列表一致
			// 返回类型一致
			// 构造方法::new
			// .orElseGet(()->new Student());
			.orElseGet(Student::new);
		System.out.println(stu);
相关推荐
xlsw_4 分钟前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹1 小时前
基于java的改良版超级玛丽小游戏
java
梧桐树04291 小时前
python常用内建模块:collections
python
Dream_Snowar1 小时前
速通Python 第三节
开发语言·python
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭1 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫2 小时前
泛型(2)
java
超爱吃士力架2 小时前
邀请逻辑
java·linux·后端
南宫生2 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石2 小时前
12/21java基础
java
高山我梦口香糖2 小时前
[react]searchParams转普通对象
开发语言·前端·javascript