Lambda表达式和Collection集合
Lambda表达式
Lambda表达式理解
Lambda表达式是Jdk 8 开始新增的一种语法形式;作用:用于简化匿名内部类的代码写法
注意:Lambda表达式只能简化函数式接口的匿名内部类!!!
什么是函数式接口?
有且仅有一个抽象方法的接口。
注意:大部分函数式接口,上面可能会有一个@FunctionalInterface的注解,有该注解的接口就必定是函数式接口。
Lambda表达式的省略写法(进一步简化Lambda表达式的写法)
参数类型可以省略不写。
l如果只有一个参数,参数类型可以省略,同时()也可以省略。
l如果Lambda表达式中的方法体代码只有一行代码,可以省略大括号不写,同时要省略分号!此时,如果这行代码是return语句,也必须去掉return关键字不写。
上代码
基于无参无返回值,无参有返回值,有参无返回值,有参有返回值
package com.itheima.yaoyao;
import java.util.Random;
public class LambdaDemo2 {
public static void main(String[] args) {
//基于匿名内部类调用useInterOne:分析有一个InterOne接口【快速创建接口的实现类对象】 怎么做!
useInterOne(new InterOne() {
@Override
public void methodOne() {
System.out.println("无参无返匿名内部类调用");
}
});
//基于Lambda表达式调用useInterOne:分析(1)必须要传递InterOne接口实现类对象【省略】(2)必须要实现methodOne抽象方法【省略】
//methodOne方法的逻辑【不能!】传递methodOne方法的逻辑(剩余的事情由Java来做) 【基于Lambda表达式来做methodOne方法的逻辑载体】
useInterOne(()->{System.out.println("lambda表达式表示无参无返");});
//基于匿名内部类调用useInterTwo
useInterTwo(new InterTwo() {
@Override
public Integer methodTwo() {
return 100;
}
});
//基于Lambda表达式调用useInterTwo:分析(1)必须要传递InterTwo接口实现类对象【省略】(2)必须要实现methodTwo抽象方法【省略】
//methodTwo方法的逻辑【不能!】传递methodTwo方法的逻辑(剩余的事情由Java来做) 【基于Lambda表达式来做methodTwo方法的逻辑载体】
//如果Lambda实现的方法需要返回值就要在{}中return回满足要求的结果
useInterTwo(()->{
return new Random().nextInt(100);
});
//基于匿名内部类调用useInterThree
useInterThree(new InterThree() {
@Override
public void methodThree(String name, String food) {
System.out.println(name+"爱喝"+food);
}
});
//基于Lambda表达式调用useInterThree:分析(1)必须要传递InterThree接口实现类对象【省略】(2)必须要实现methodThree抽象方法【省略】
//methodThree方法的逻辑【不能!】传递methodThree方法的逻辑(剩余的事情由Java来做) 【基于Lambda表达式来做methodThree方法的逻辑载体】
//如果Lambda表达式作为方法的载体,方法声明了形式参数,在Lambda的()中也要声明同样形式参数
useInterThree( (String name,String food) ->{
System.out.println(name + "爱吃"+"小鸡炖蘑菇");
});
//基于匿名内部类调用useInterFour
useInterFour(new InterFour() {
@Override
public String methodFour(String foodOne, String foodTwo) {
return foodOne+"炖"+foodTwo;
}
});
//基于Lambda调用
useInterFour((String foodOne, String foodTwo) ->{return foodOne + "炒"+ foodTwo ;});
}
//编写4个方法分别将四个接口作为方法的参数【传递四个接口中不同类型的方法Lambda表达式】
//在编写方法的时候并不明确方法的具体逻辑是什么 【多态:传递进来的实现类的实现逻辑是什么,这里就执行什么逻辑】
public static void useInterOne(InterOne interOne) {
interOne.methodOne();
}
public static void useInterTwo(InterTwo interTwo) {
Integer result = interTwo.methodTwo();
System.out.println("useInterTwo Result:" + result);
}
public static void useInterThree(InterThree interThree) {
interThree.methodThree("张二狗", "西红柿炒洋柿子");
}
public static void useInterFour(InterFour interFour) {
String result = interFour.methodFour("大葱", "笨鸡蛋");
System.out.println("useInterFour Result:" + result);
}
}
@FunctionalInterface
interface InterOne {
//无参无返回值的抽象方法
void methodOne();
}
@FunctionalInterface
interface InterTwo {
//无参有返回值的抽象方法
Integer methodTwo();
}
@FunctionalInterface
interface InterThree {
//有参无返回值的抽象方法
void methodThree(String name, String food);
}
@FunctionalInterface
interface InterFour {
//有参有返回值的抽象方法
String methodFour(String foodOne, String foodTwo);
}
面试题:你开发的时候使用过Lambda吗? 【使用过!】
面试题:有人说Lambda就是匿名内部类的代替的方式,你是否认同? 【不认同】
答案:(1)Lambda只能作用于接口,匿名内部类可以作用于抽象类【子类对象】/接口【实现类对象】/具体类【子类对象】
(2)Lambda只能作用于函数式接口【只能有一个抽象方法】,匿名内部类作用于接口【接口中可以有任意个数的抽象方法】
(3)匿名内部类本质上是通过语法底层生成一个.class文件,Lambda表达式不会额外生成.class文件【会在代码执行的时候动态编译】
(4)思想层面的不同,匿名内部类体现还是面向对象【对象】,Lambda表达式体现的是函数式思想【作为方法逻辑的载体而出现】
Collection集合
Collection是单列集合的祖宗,它规定的方法(功能)是全部单列集合都会继承的。
Collection的常见方法如下:
迭代器概述
迭代器是用来遍历集合的专用方式(数组没有迭代器),在Java中迭代器的代表是Iterator。
Collection集合获取迭代器的方法:
Iterator迭代器中的常用方法
★注意事项:一次hasNext方法搭配一次next方法(否则容易越界) 迭代器是一次性的
★注意事项:不推荐在迭代过程中使用集合修改集合长度,如果要删除元素可以通过迭代器。
遍历Collection集合的三种方法
迭代器
Collection<String> names = List.of("施恩", "徐宁", "郁保四", "李应", "周通", "公孙胜", "白胜", "汤隆", "张清", "皇甫端");
// 使用迭代器Iterator遍历集合中的元素
Iterator<String> iterator = names.iterator();
while (iterator.hasNext()){
String next = iterator.next();
System.out.println(next);
}
增强for循环
Collection<String> names = List.of("施恩", "徐宁", "郁保四", "李应", "周通", "公孙胜", "白胜", "汤隆", "张清", "皇甫端");
// 使用增强for循环遍历names集合
for (String name: names) {
System.out.println(name);
}
lambda表达式
Collection<String> names = List.of("施恩", "徐宁", "郁保四", "李应", "周通", "公孙胜", "白胜", "汤隆", "张清", "皇甫端");
// 使用Lambda表达式循环遍历names集合
names.forEach(element->{
System.out.println(element);
});
names.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
Lambda表达式和Collection集合的更多相关文章
- java使用lambda表达式对List集合进行操作(JDK1.8)
1. 使用lambda表达式对List集合进行操作(JDK1.) List<TreeDto> collect = list.stream().filter(item -> item. ...
- Lambda表达式和Java集合框架
本文github地址 前言 我们先从最熟悉的Java集合框架(Java Collections Framework, JCF)开始说起. 为引入Lambda表达式,Java8新增了java.util. ...
- Java8新特性 利用流和Lambda表达式对List集合进行处理
Lambda表达式处理List 最近在做项目的过程中经常会接触到 lambda 表达式,随后发现它基本上可以替代所有 for 循环,包括增强for循环.也就是我认为,绝大部分的for循环都可以用 la ...
- 用Lambda表达式操作List集合
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- java lambda表达式检查list集合是否存在某个值
import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class ...
- java 数据类型:集合接口Collection之常用ArrayList;lambda表达式遍历;iterator遍历;forEachRemaining遍历;增强for遍历;removeIf批量操作集合元素(Predicate);
java.util.Collection接口 Java的集合主要由两个接口派生出来,一个是Collection一个是Map,本章只记录Collection常用集合 集合只能存储引用类型数据,不能存储基 ...
- Lambda表达式遍历集合
1.Collection Java 8 为Iterable接口新增了一个forEach(Consumer action)默认方法,该方法所需参数的类型是一个函数式接口,而Iterable接口是Coll ...
- Java List集合 遍历 四种方式(包含 Lambda 表达式遍历)
示例代码如下: package com.miracle.luna.lambda; import java.util.ArrayList; import java.util.List; /** * @A ...
- 【转】Java 8十个lambda表达式案例
1. 实现Runnable线程案例 使用() -> {} 替代匿名类: //Before Java 8: new Thread(new Runnable() { @Override public ...
- Java 8十个lambda表达式案例
1. 实现Runnable线程案例 使用() -> {} 替代匿名类: //Before Java 8: new Thread(new Runnable() { @Override public ...
随机推荐
- Rust学习之旅(读书笔记):枚举 (Enum)
Rust学习之旅(读书笔记):枚举 (Enum) C 语言的枚举类型很弱,不如后来的语言,也不如之前的语言.在 C 语言里面枚举量就是一个名字,更方便的定义常量.今天读了<The Rust Pr ...
- 帮你短时间拿下Git,Git详细教程(浓缩的都是精华)
Git学习笔记 Git是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理. 在团队开发中git是必不可少的,它是目前为止最流行的版本控制工具 Git是免费.开源的,由Li ...
- JavaScript:操作符:操作符的特点
在JS中,所有的操作符,都同时在做两件事,第一件事是进行计算,第二件事是返回计算的结果,这个结果需要有变量去接收,否则就成为无人认领的数据而被垃圾回收: 在JS中,有很多不常用的操作符以及语法,容易让 ...
- STL set容器常用API
set容器,容器内部将数据自动排序(平衡二叉树),不能插入重复元素.multiset可以插入重复元素.不能修改容器中的值,通过删除值,在插入. #define _CRT_SECURE_NO_WARNI ...
- 【转载】【WinAPI】LockWindowUpdate的函数的用法
DelPhi LockWindowUpdate的函数的用法 Application.ProcessMessages; LockWindowUpdate(Self.Handle); //锁住当前窗口 L ...
- 小项目中vuex使用频率不太多我们完全可以用provide inject 来代替可以让项目小不少
在一般小型项目中vuex实在是太浪费了所以我们可以用到 vue中的provide inject 代替 1.在vue3中我们先另起一个 文件创建一个全局的状态和方法的地方(如果你的全局状态特别的多记得要 ...
- SOFAJRaft源码阅读-ShutdownHook如何优雅的停机
Java程序经常会遇到进程挂掉的情况,一些状态没有正确的保存下来,这时候就需要在JVM关掉的时候执行一些清理现场的代码.JAVA中的ShutdownHook提供了比较好的方案.而在SOFAJRaft- ...
- Coolify系列02-从0到1超详细手把手教你上手Coolify
接着上集(Coolify系列01- 从0到1超详细手把手教你上手Heroku 和 Netlify 的开源替代方案 ),此时我们已经运行成功,如果没有成功,可以参考我的Coolify系列其他文章来解决问 ...
- 在 MBP(Apple M1 Pro)上捣鼓友善 nanoPi R5S——【一、构建 rkdeveloptool】
在种草了很多天之后,最近终于在淘宝下单了友善 nanoPi R5S. 选择友善 nanoPi R5S 有两点主要理由: 1. 自带 EMMC 存储,可以使用 RockChip 提供的 MaskRom ...
- 移动 WEB 开发布局方式 ---- flex 布局
一.flex布局体验 1.1 传统布局 flex 布局 1. 2 初体验 1. 搭建 HTML 结构 <div> <span>1</span> <span&g ...