JavaEE_day_25_Lambda、SteamAPI
目录
- lambd表达式
- Supplier
- Consumer
- Function
- Predicate
- 方法引用简写
- 构造方法简写
- 数组声明简写
- StreamAPI
1.lambd表达式
- lamada表达式函数必须保证所传递函数是只有一个抽象方法的接口类.
- 相当于匿名内部类(一个一次性的单一抽象方法接口类)的升级版,在箭头函数调用lamuda表达式时,必须与抽象方法一一对应,否则调用失败报错
- 单句不想返回,则加{}不用加return,
Integer [] arr = {1,5,4,2,8,3,4,9};List<Integer> list = Arrays.asList(arr);//匿名内部类实现排序(降序)list.sort(new Comparator<Integer>(){@Overridepublic int compare(Integer o1, Integer o2) {return o2-o1;}});//lambda表达式实现排序(升序)list.sort((o1,o2)->o1-o2);for (Integer integer : list) {System.out.print(integer +" ");}
- 函数式接口,给lambda表达式操作空间只留一个抽象方法,可以有其他实现的方法, (就是一个像函数的接口类)
有参的函数式接口(附三种调用方式)
无参的直接写call(()->System.out.println(“lambda表达式”));
public class _02_FunInterface {public static void main(String[] args) {String str = "有参函数式接口调用";// 1 匿名内部类call(new MyFunctionInter2(){@Overridepublic void printMessage(String str) {System.out.println(str);}}, str);// 2 lambdacall(s -> System.out.println(s), str);// 3 创建函数对象MyFunctionInter2 inter2 = s -> System.out.println(s);call(inter2, str);}// str为 printMessage方法的参数public static void call(MyFunctionInter2 func,String str) {// 调用func对象 的printMessage方法 并传入 strfunc.printMessage(str);}
}
@FunctionalInterface
interface MyFunctionInter2 {void printMessage(String str);
}
2.supplier
- 泛型中可以规定任意类型
- 表示供应商,所以有返回值,可以获取数据
// 实现接口函数public static Integer getResult(Supplier<Integer> supplier) {return supplier.get();}
// 匿名内部类实现int i = getResult(new Supplier<Integer>() {@Overridepublic Integer get() {return 2;}});System.out.println(i);// lambda表达式实现i = getResult(() -> 7);System.out.println(i);
3.Consumer
- 表示消费者接口,所以不需要返回值
//前一个参数即为accept的实现方法体,后一个参数是传入是accept要传入的参数call((s)->System.err.println(s),str);}public static void call(Consumer<String> c,String msg){c.accept(msg);}
4.Function
- Function<T,R> 实现方法中传入T类型,返回R类型
R apply(T t) 方法
public static void main(String[] args) {//写的是apply的参数和返回值int num = convertType(x->(int)x, 'a');System.out.println(num);}// 把字符串转换为数字public static Integer convertType(Function<Character,Integer> function, Character ch) {int i = function.apply(ch);return i;}
5.Predicate
Predicate 接口 断言接口,就是做一些判断
booean test(T) 用于做校验比较操作
public static void main(String[] args) {String message = "ok1";boolean result = call(msg->msg.equals("ok"),message);System.out.println(result);}//booean test(T) 用于做校验比较操作public static boolean call(Predicate<String> predicate, String message) {return predicate.test(message);}
6.方法引用简写
Lambda表达式的另一种表示形式,提高复用率和灵活性
当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!
方法引用可以看做是Lambda表达式深层次的表达。换句话说,方法引用就是Lambda表达式,也就是函数式接口的一个实例,通过方法的名字来指向一个方法,可以认为是Lambda表达式的一个语法糖。
要求:实现接口的抽象方法的参数列表和返回值类型,必须与方法引用的方法的参数列表和返回值类型保持一致!
格式:使用操作符“::” 将类(或对象) 与方法名分隔开来。
如下三种主要使用情况:
对象::实例方法名
类::静态方法名
类::实例方法名
对象::实例方法名
public static void main(String[] args) {Integer i = new Integer(123);//lambda表达式Supplier<Integer> supplier = ()->i.hashCode();System.out.println(supplier.get());//对象的引用::实例方法Supplier<Integer> supplier1 = i::hashCode;System.out.println(supplier1.get());call(()->i.hashCode());call(i::hashCode);}public static Integer call(Supplier<Integer> sup){return sup.get();}
类::静态方法名
int i = 123;//lambda表达式写法Function<Integer,String> fun = x -> Integer.toBinaryString(i);System.out.println(fun.apply(i));//类名::静态方法名()省略了参数,因为调用apply时还会调用Function<Integer,String> fun1 = Integer::toBinaryString;System.out.println(fun1.apply(i));
类::实例方法名
//lambda表达式BiPredicate<String,String> bi = (x,y)->x.equals(y);System.out.println(bi.test("oak","ok"));//类名::实例方法BiPredicate<String,String> bi1 = String::equals;System.out.println(bi1.test("ock","ock"));
7.构造方法简写
构造方法
//无参构造器Supplier<Student> sup11 = () -> new Student();System.out.println(sup11.get());Supplier<Student> sup12 = Student::new;System.out.println(sup12.get());//有参构造器Supplier<Student> sup21 = () -> new Student("王老菊");System.out.println(sup21.get().getName());//apply()的<参数,返回值>Function<String,Student> sup22 = Student::new;System.out.println(sup22.apply("王老菊").getName());
8.数组声明简写
数组声明简写
// 数组引用写法,只能动态声明,不能静态声明Function<Integer, Integer[]> fun1 = Integer[]::new;Integer[] arr1 = fun1.apply(2);System.out.println(arr1.length);
9.StreamAPI
- 简言之,Stream API 提供了一种高效且易于使用的处理数据的方式。
就是用来处理集合、数组的API,集合讲的是数据,而流是计算
注意:
①Stream 自己不会存储元素。
②Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream。
③Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。
9.1 创建流
// 1 通过数组 Stream.ofString[] strings = { "a", "b", "c", "d" };Stream<String> stream1 = Stream.of(strings);// 2 通过集合List<String> strings2 = Arrays.asList(strings);Stream<String> stream2 = strings2.stream();// 3 通过Stream.generate 方法来创建// 这是一个无限流,无限大,通过这种方式创建的流,在操作的时候,最好使用limit进行最大数量限制// generate的参数是 Supplier 只有一个get方法,是无参有返回值的// get方法的返回值,作为整个集合中的数据,下面这个等于都赋值为1Stream<Integer> generate = Stream.generate(() -> 1);// 可以通过limit限制最多元素个数generate.limit(5).forEach(x -> System.out.println(x));// 4 通过Stream.iterate 方法来创建// 这是一个无限流,无限大,通过这种方式创建的流,在操作的时候,最好使用limit进行最大数量限制// 第一个参数是起始值,第二个参数是UnaryOperator 继承了Function 所以 有参有返回值// 1 就是起始值, x+2 就是步长,类似于一个死循环,起始值是1,步长 是2,终止条件是trueStream<Integer> iterate = Stream.iterate(1, x->x+2);iterate.limit(5).forEach(x->System.out.println(x));// 5 已有类的Stream源生成APIString str = "abc";IntStream chars = str.chars();chars.forEach(x->System.out.println(x));
9.2 流的中间操作(转换算子)
stream.(转换算子).(动作算子)
- filter : 对元素进行过滤,不符合条件的,就不要了
- distinct : 去掉重复
- skip : 跳过多少个元素
- limit : 取一个集合中的前几条数据
- map : 可以理解为是在遍历集合的过程中,对元素进行操作. 比如进行判断,集合元素是否大于4 ,返回值为boolean类型,或者对集合元素进行更改,比如每个元素都自身+1
- flatMap : 解决一个字符串数组,返回单一的字符串使用flatMap
public static void main(String[] args) {String[] arr = { "a", "b", "c", "a" };List<String> strings = Arrays.asList(arr);// 创建流对象Stream<String> stream = strings.stream();// filter:对元素进行过滤(参数为predicate(参数<T>返回值boolean))List<String> value = stream.filter(x -> x.equals("a")).collect(Collectors.toList());System.out.println(value);// 需要重新生成一个stream,否则报错,不能使用同一个streamstream = strings.stream();value = stream.skip(1).collect(Collectors.toList());System.out.println(value);// map,在遍历过程中,对元素进行操作,返回Boolean类型stream = strings.stream();//在元素尾部添加字符串List value1 = stream.map(x -> x+"xxx").collect(Collectors.toList());System.out.println(value1);//distinct去重stream = strings.stream();value = stream.distinct().collect(Collectors.toList());System.out.println(value);//limit(n) :取集合中前n条数据stream = strings.stream();value = stream.limit(2).collect(Collectors.toList());System.out.println(value);//flatMap : 合并两段数组String[] arr1 = {"abc","abc"};strings = Arrays.asList(arr1);stream = strings.stream();value = stream.map(x->x.split("")).flatMap(array->Arrays.stream(array)).collect(Collectors.toList());System.out.println(value);}
9.3 流的终止操作(动作算子)
stream.(转换算子).(动作算子)
- forEach : 循环
- 计算 : min,max,count,average
- 匹配 :anyMatch,allMatch,noneMatch,findFirst,findAny
- 汇聚 : reduce
- 收集器 : collect
String[] arr = { "a", "b", "c" };List<String> strings = Arrays.asList(arr);Stream<String> stream = strings.stream();// 测试forEachstream.filter(x -> x.equals("a")).forEach(x -> System.out.println(x));// 测试 countstream = strings.stream();long count = stream.count();System.out.println(count);//统计 有几个astream = strings.stream();count = stream.filter(x -> x.equals("a")).count();System.out.println(count);// collect收集器// 把结果收集,并组织成集合stream = strings.stream();List<String> list = stream.map(x -> x + "==").collect(Collectors.toList());System.out.println(list);
JavaEE_day_25_Lambda、SteamAPI相关推荐
- 转载:物联网平台概述
版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/franklfeng/article/details/77418158 </div><li ...
- 专利审查指南(2010)
专利审查指南(2010) http://www.chinalaw.gov.cn/article/fgkd/xfg/gwybmgz/201004/20100400253035.shtml来源国务院法制办 ...
- 湖南省中职学业水平测试试题信息技术
试题: 1.按照指法要求,击打空格键,应使用( ). A.左手和右手的食指,因食指最灵活 B.左手或右手的拇指 C.左手或右手的中指 D.左手或右手的无名指 2.显示器的清晰度是由( )决定的. A. ...
- Photoshop入门与进阶实例:1.4 图层的概念和基本操作
1.认识图层 图层功能被誉为Photoshop的灵魂,这个比喻一点也不夸张!图层在我们使用Photoshop进行图像处理中,具有十分重要的地位,也是最常用到的功能之一.掌握图层的概念是我们学习Phot ...
- 2023年你最值得了解的信息技术-AI篇(二)
20688 北京朗阁信息技术有限公司 企业服务 前沿技术 北京市 mailkey 专注云企业邮件领域的产品,随云服务而生. 未融资 MailKey 是北京朗阁信息技术有限公司(以下简称"朗 ...
- java SteamAPI练习(流的创建、流的操作、流的终止)
练习题一 给定一个数字列表,如何返回一个由每个数的平方构成的列表呢? ,给定[1,2,3,4,5], 应该返回[1,4,9,16,25] public class Problem1 {public s ...
- Lambda表达式和SteamAPI
Lambda表达式和SteamAPI是JDK8的新特性,所有在实验下面代码时候,请升级JDK到8版本,否则会编译 报错. 首先看Lambda表达式,同正则表达式类似,Lambda表达式不能在JAVA代 ...
- 程序主动进行电话短信报警,自定义电话、短信、钉钉报警通知
程序主动进行电话短信报警,自定义电话.短信.钉钉报警通知 一. 规则说明 这里我们要利用到阿里云的云监控的手段,有一个叫做事件监控的东西,可以通过自定义事件上传来进行监控报警. 流程: 程序发现错误 ...
- nginx配置http、https访问,nginx指定ssl证书,阿里云腾讯云华为云设置nginx https安全访问
nginx配置http.https访问 要设置https访问需要从对应的云厂商申请证书,并下载Nginx证书到服务器. 我这里从阿里云申请了免费的域名证书,然后将证书放置在服务器的/etc/ssl/. ...
最新文章
- 【阿里云MPS】MPS(原MTS)概述
- 小米用户画像_企鹅智库:高学历用苹果中老年用华为 男性用小米女性用OV
- linux设置静态ip后端口不能上网,Centos7设置静态IP后无法上网的解决方法
- JavaScript面向对象:类、方法、属性
- python 类 内置方法_类相关内置方法
- 计算机体系结构及组成原理
- win10字体模糊发虚怎么回事?win10字体模糊发虚电脑问题还是系统问题?
- Unity3D AssetStore下载文件/项目保存位置
- RT-Thread : IEEE1588/PTP 协议的实现(2)
- Freeradius安装和配置
- icem二维非结构网格划分_【史上最全轴承结构化网格划分系列】第五弹——自动校准滚针轴承(文末附模型领取方式)...
- css背景颜色设置后没生效
- 简单易懂的方式去看C语言精华--指针
- 怎么知道局域网内其他设备的IP
- 2017大数据与分析创新峰会9月6-7日在上海宝华万豪酒店拉开帷幕
- WEB接口测试之Jmeter接口测试自动化 (二)
- 2021年中国奶油行业上市企业对比分析:海融科技VS 立高食品[图]
- 人工智能究竟离我们有多远?
- 百度云高速下载Pandownload
- 长痘痘不能吃哪些食物