在我们看他人code的时候经常会看到,可能会经常看到lambda表达式,函数式接口,以及流式计算。在刚接触这些新功能时,也觉得真的有必要吗?但是现在写多了,发现这个功能确实能简化代码结构,提升编码效率。lambda表达式,函数式接口,流式计算单个来用确实非常难用,但是整合到一起,就会发生非常奇妙的反应。

lambda表达式

lambda表达式允许把函数作为一个方法的参数。即,函数作为参数传递进方法。

lambda语法

  1. (parameters) -> expression
  2. OR
  3. (parameters) -> {statements;}

lambada表达式的几个重要特征:

  • 可选类型声明:不需要申明参数类型,编译器可以统一识别参数类型
  • 可选参数圆括号:一个参数无需定义圆括号。但是多个参数需要定义圆括。
  • 可选大括号:如果主体只包含了一个语句,就不需要使用大括号。
  • 可选返回关键字:如果主体只有一个表达式返回值,编译器会自动返回值。
  1. // 1. 不需要参数,直接返回值
  2. () -> 3
  3. // 2. 接收一个参数,返回其两倍
  4. x -> 2 * x
  5. // 3. 接收两个数字, 返回差
  6. (x, y) -> x - y

函数式接口

什么是函数式接口

函数式接口就是有且仅有一个抽象方法的接口。(但是可以有多个非抽象方法)。

函数式接口可以被转换为lambda表达式。

四大函数式接口

  1. java.util.function.Consumer
  2. // 消费者:接收一个参数,没有返回值
  3. @FunctionalInterface
  4. public interface Consumer<T> {
  5. /**
  6. * Performs this operation on the given argument.
  7. *
  8. * @param t the input argument
  9. */
  10. void accept(T t);
  11. }
  12. -----------------------------------------------------------------------------
  13. java.util.function.Predicate
  14. // 断言者:接收一个参数,返回一个boolean
  15. @FunctionalInterface
  16. public interface Predicate<T> {
  17. /**
  18. * Evaluates this predicate on the given argument.
  19. *
  20. * @param t the input argument
  21. * @return {@code true} if the input argument matches the predicate,
  22. * otherwise {@code false}
  23. */
  24. boolean test(T t);
  25. }
  26. ----------------------------------------------------------------------------------
  27. java.util.function.Supplier
  28. // 提供者:不接受任何参数,返回会一个参数
  29. @FunctionalInterface
  30. public interface Supplier<T> {
  31. /**
  32. * Gets a result.
  33. *
  34. * @return a result
  35. */
  36. T get();
  37. }
  38. --------------------------------------------------------------------------------
  39. java.util.function.Function
  40. // 操作者:接收一个参数,返回一个参数
  41. @FunctionalInterface
  42. public interface Function<T, R> {
  43. /**
  44. * Applies this function to the given argument.
  45. *
  46. * @param t the function argument
  47. * @return the function result
  48. */
  49. R apply(T t);
  50. }

下面我们来看看,lambda和函数式接口的使用。

  1. package com.hardy;
  2. import org.junit.Test;
  3. import java.util.function.Consumer;
  4. import java.util.function.Predicate;
  5. /**
  6. * @description:
  7. * @author: Administrator
  8. * @time: 2022/8/21
  9. */
  10. public class FunctionTest {
  11. @Test
  12. public void testConsumer(){
  13. Consumer<Object> consumer = new Consumer<>() {
  14. @Override
  15. public void accept(Object o) {
  16. System.out.println(o);
  17. }
  18. };
  19. consumer.accept("test");
  20. System.out.println("--------------------");
  21. // lambda
  22. Consumer<String> lc = (s) -> {
  23. System.out.println(s);
  24. };
  25. lc.accept("lambda");
  26. System.out.println("--------------------");
  27. // lambda
  28. Consumer<String> lc2 = (s) -> {
  29. System.out.println(s);
  30. };
  31. lc2.accept("lambda2");
  32. System.out.println("--------------------");
  33. // lambda
  34. Consumer<String> ll = System.out::println;
  35. ll.accept("ll");
  36. }
  37. @Test
  38. public void testPredicate(){
  39. Predicate<Integer> predicate = new Predicate<>() {
  40. @Override
  41. public boolean test(Integer o) {
  42. if (o > 60) {
  43. return true;
  44. } else {
  45. return false;
  46. }
  47. }
  48. };
  49. System.out.println(predicate.test(61));
  50. System.out.println("--------------------------");
  51. Predicate<Integer> predicate1 = i -> {
  52. return i > 60;
  53. };
  54. System.out.println(predicate1.test(50));
  55. }
  56. }

如果只看lambda表达式,函数式接口,你也许会感觉就那么回事,感觉也没啥好的。但是,当你看到流式计算,你才会体会到lambda表达式和函数式接口给编程带来的简洁。

流式计算

思考:如何使用一行代码实现,下列要求:

  1. 对象的年龄大于18
  2. 性别为男性
  3. id为偶数
  4. id 倒序排列
  5. name字母大写
  1. public class StreamTest {
  2. /**
  3. * 1. 对象的年龄大于18
  4. * 2. 性别为男性
  5. * 3. id为偶数
  6. * 4. id 倒序排列
  7. * 5. name字母大写
  8. */
  9. @Test
  10. public void testStream() {
  11. // 这里模拟从数据库获取数据
  12. User u1 = new User(1, "name1", "male", 16);
  13. User u2 = new User(2, "name2", "female", 17);
  14. User u3 = new User(3, "name3", "male", 18);
  15. User u4 = new User(4, "name4", "male", 19);
  16. User u5 = new User(5, "name5", "male", 26);
  17. User u6 = new User(6, "name6", "male", 35);
  18. User u7 = new User(7, "name7", "male", 19);
  19. User u8 = new User(8, "name8", "female", 12);
  20. // 集合
  21. List<User> list = Arrays.asList(u1, u2, u3, u4, u5, u6, u7, u8);
  22. // stream
  23. List<User> users = list.stream().filter(user -> user.getAge() > 18)
  24. .filter(user -> user.getSex().equals("male"))
  25. .filter(user -> user.getId() % 2 == 0)
  26. .sorted(Comparator.comparingInt(User::getId))
  27. .peek(user -> user.setName(user.getName().toUpperCase())).collect(Collectors.toList());
  28. System.out.println(users);
  29. }
  30. }

记住:存储交给集合,计算交给流

Java的lamda表达式/函数式接口/流式计算的更多相关文章

  1. 第46天学习打卡(四大函数式接口 Stream流式计算 ForkJoin 异步回调 JMM Volatile)

    小结与扩展 池的最大的大小如何去设置! 了解:IO密集型,CPU密集型:(调优)  //1.CPU密集型 几核就是几个线程 可以保持效率最高 //2.IO密集型判断你的程序中十分耗IO的线程,只要大于 ...

  2. 流式计算新贵Kafka Stream设计详解--转

    原文地址:https://mp.weixin.qq.com/s?__biz=MzA5NzkxMzg1Nw==&mid=2653162822&idx=1&sn=8c4611436 ...

  3. 流式计算(一)-Java8Stream

    大约各位看官君多少也听说了Storm/Spark/Flink,这些都是大数据流式处理框架.如果一条手机组装流水线上不同的人做不同的事,有的装电池,有的装屏幕,直到最后完成,这就是典型的流式处理.如果手 ...

  4. Others-阿里专家强琦:流式计算的系统设计和实现

    阿里专家强琦:流式计算的系统设计和实现 更多深度文章,请关注云计算频道:https://yq.aliyun.com/cloud 阿里云数据事业部强琦为大家带来题为“流式计算的系统设计与实现”的演讲,本 ...

  5. 分布式流式计算平台——S4

    本文是作者在充分阅读和理解Yahoo!最新发布的技术论文<S4:Distributed Stream Computing Platform>的基础上,所做出的知识分享. S4是Yahoo! ...

  6. 流式计算(三)-Flink Stream 篇一

    原创文章,谢绝任何形式转载,否则追究法律责任! ​流的世界,有点乱,群雄逐鹿,流实在太多,看完这个马上又冒出一个,也不知哪个才是真正的牛,据说Flink是位重量级选手,能流计算,还能批处理, 和其他伙 ...

  7. Stream流式计算

    Stream流式计算 集合/数据库用来进行数据的存储 而计算则交给流 /** * 现有5个用户,用一行代码 ,一分钟按以下条件筛选出指定用户 *1.ID必须是偶数 *2.年龄必须大于22 *3.用户名 ...

  8. Apache Beam—透视Google统一流式计算的野心

    Google是最早实践大数据的公司,目前大数据繁荣的生态很大一部分都要归功于Google最早的几篇论文,这几篇论文早就了以Hadoop为开端的整个开源大数据生态,但是很可惜的是Google内部的这些系 ...

  9. 大数据学习:storm流式计算

    Storm是一个分布式的.高容错的实时计算系统.Storm适用的场景: 1.Storm可以用来用来处理源源不断的消息,并将处理之后的结果保存到持久化介质中. 2.由于Storm的处理组件都是分布式的, ...

随机推荐

  1. Springboot 整合 MongoDB

    Springboot 整合 MongoDB 这节我们将整合 Spring Boot 与 Mongo DB 实现增删改查的功能,并且实现序列递增. Mongo DB 的基本介绍和增删改查的用法可以参考我 ...

  2. cmd中常用的dos命令

    在电脑中除了我们常见的图形界面之外,图形页面的操作相信都会.那么还有在cmd执行的一些dos命令,可以简单记一下,方便日后复习所用 首先打开cmd窗口,windows+R,然后在对话框输入cmd,进入 ...

  3. 《ASP.NET Core 6框架揭秘》样章[200页/5章]

    作为<ASP.NET Core 3 框架揭秘>的升级版,<ASP.NET Core 6框架揭秘>不仅针对ASP.NET Core 6的新特性进行了修订,并添加了若干原来没有的内 ...

  4. java的方法(类似与C语言函数)

    package www.nihao; import java.util.Scanner; public class demo02 { public static void main(String[] ...

  5. Kafka 部署完在服务器端可以访问,而在外部其它电脑访问不了

    Kafka 部署完在服务器端可以访问,而在外部其它电脑访问不了 原因:config/server.properties的listeners和advertised.listeners 不配置的话默认的l ...

  6. @ConditionalOnMissingBean 如何实现覆盖第三方组件中的 Bean

    1. 自定义一个简单 spring-boot 组件 创建 olive-starter 项目 对应的 pom.xml文件如下 <project xmlns="http://maven.a ...

  7. 老子云携手福昕鲲鹏,首次实现3D OFD三维版式文档的重大突破

    你见过能动起来的文档吗? 这可不是动图,也不是视频,而是可以直接自由交互3D模型的3D OFD文档! OFD可能有人不熟悉,它其实是国产"PDF",3D OFD则突破了以往文字.图 ...

  8. 「SDOI2016」征途 题解

    「SDOI2016」征途 先浅浅复制一个方差 显然dp,可以搞一个 \(dp[i][j]\)为前i段路程j天到达的最小方差 开始暴力转移 \(dp[i][j]=min(dp[k][j-1]+?)(j- ...

  9. Excel 数学函数(三):RAND 和 RANDBETWEEN

    Excel 主要有 RAND 和 RANDBETWEEN 这两个函数生成随机数.RAND 默认生成 0~1 的随机数:RANDBETWEEN 有两个参数:bottom 和 top,bottom 代表函 ...

  10. SpringBoot接收MultipartFile文件,并保存文件

    package com.hrw.controller; import com.hrw.pojo.Result; import org.apache.tomcat.util.http.fileuploa ...