目录

  1. lambd表达式
  2. Supplier
  3. Consumer
  4. Function
  5. Predicate
  6. 方法引用简写
  7. 构造方法简写
  8. 数组声明简写
  9. 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相关推荐

  1. 转载:物联网平台概述

    版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/franklfeng/article/details/77418158 </div><li ...

  2. 专利审查指南(2010)

    专利审查指南(2010) http://www.chinalaw.gov.cn/article/fgkd/xfg/gwybmgz/201004/20100400253035.shtml来源国务院法制办 ...

  3. 湖南省中职学业水平测试试题信息技术

    试题: 1.按照指法要求,击打空格键,应使用( ). A.左手和右手的食指,因食指最灵活 B.左手或右手的拇指 C.左手或右手的中指 D.左手或右手的无名指 2.显示器的清晰度是由( )决定的. A. ...

  4. Photoshop入门与进阶实例:1.4 图层的概念和基本操作

    1.认识图层 图层功能被誉为Photoshop的灵魂,这个比喻一点也不夸张!图层在我们使用Photoshop进行图像处理中,具有十分重要的地位,也是最常用到的功能之一.掌握图层的概念是我们学习Phot ...

  5. 2023年你最值得了解的信息技术-AI篇(二)

    20688 北京朗阁信息技术有限公司 企业服务  前沿技术 北京市 mailkey 专注云企业邮件领域的产品,随云服务而生. 未融资 MailKey 是北京朗阁信息技术有限公司(以下简称"朗 ...

  6. java SteamAPI练习(流的创建、流的操作、流的终止)

    练习题一 给定一个数字列表,如何返回一个由每个数的平方构成的列表呢? ,给定[1,2,3,4,5], 应该返回[1,4,9,16,25] public class Problem1 {public s ...

  7. Lambda表达式和SteamAPI

    Lambda表达式和SteamAPI是JDK8的新特性,所有在实验下面代码时候,请升级JDK到8版本,否则会编译 报错. 首先看Lambda表达式,同正则表达式类似,Lambda表达式不能在JAVA代 ...

  8. 程序主动进行电话短信报警,自定义电话、短信、钉钉报警通知

    程序主动进行电话短信报警,自定义电话.短信.钉钉报警通知 一. 规则说明 这里我们要利用到阿里云的云监控的手段,有一个叫做事件监控的东西,可以通过自定义事件上传来进行监控报警. 流程: 程序发现错误 ...

  9. nginx配置http、https访问,nginx指定ssl证书,阿里云腾讯云华为云设置nginx https安全访问

    nginx配置http.https访问 要设置https访问需要从对应的云厂商申请证书,并下载Nginx证书到服务器. 我这里从阿里云申请了免费的域名证书,然后将证书放置在服务器的/etc/ssl/. ...

最新文章

  1. 【阿里云MPS】MPS(原MTS)概述
  2. 小米用户画像_企鹅智库:高学历用苹果中老年用华为 男性用小米女性用OV
  3. linux设置静态ip后端口不能上网,Centos7设置静态IP后无法上网的解决方法
  4. JavaScript面向对象:类、方法、属性
  5. python 类 内置方法_类相关内置方法
  6. 计算机体系结构及组成原理
  7. win10字体模糊发虚怎么回事?win10字体模糊发虚电脑问题还是系统问题?
  8. Unity3D AssetStore下载文件/项目保存位置
  9. RT-Thread : IEEE1588/PTP 协议的实现(2)
  10. Freeradius安装和配置
  11. icem二维非结构网格划分_【史上最全轴承结构化网格划分系列】第五弹——自动校准滚针轴承(文末附模型领取方式)...
  12. css背景颜色设置后没生效
  13. 简单易懂的方式去看C语言精华--指针
  14. 怎么知道局域网内其他设备的IP
  15. 2017大数据与分析创新峰会9月6-7日在上海宝华万豪酒店拉开帷幕
  16. WEB接口测试之Jmeter接口测试自动化 (二)
  17. 2021年中国奶油行业上市企业对比分析:海融科技VS 立高食品[图]
  18. 人工智能究竟离我们有多远?
  19. 百度云高速下载Pandownload
  20. 长痘痘不能吃哪些食物

热门文章

  1. 7-2 英文单词排序 (25 分)
  2. 2022.06.26 华为od机试真题
  3. Java——单例模式和延迟加载
  4. android中获取打气筒服务的三种形式
  5. 高级程序员装逼指南,是高级哦!(转)
  6. 工业级宽温版RK3399K核心板发布
  7. vivo脑洞大开,竟给手机内置微型无人机!
  8. 各种json工具包的比较
  9. 求2的n次方对1e9+7的模,n大约为10的100000次方(费马小定理)
  10. MODIS卫星遥感数据下载处理