Lambda表达式

  语义本身就代表了做事情的动作,没有对象的概念在其中。

  Java中使用Lambda表达式的前提:必须有 函数式接口。

  概念:有且只有一个的抽象方法的接口就叫函数式接口。

  为确保当前接口为函数式接口,在定义接口的前一行加 @FunctionalInterface

  格式:

@FunctionalInterface
public interface 函数式接口名{//Code...
}

  Lambda表达式使用必须要有函数式接口的推断环境。

    1、要么通过方法的参数类型类确定是那个函数式接口。

    2、要么通过复制操作来确定是那个函数式接口。

  Lambda的格式就是将抽象方法分解成为以下三点:

    1、参数  

    2、箭头  

    3、代码

  例:

public sbstract int sum(int a,int b);
//Lambda的标准格式:
(int a,int b) -> {return a+b;}
//Lambda的简化格式:
(a,b) -> a+b
//若参数有且只有一个参数,可以省略小括号。

实例:

@FunctionalInterface
public interface Calculator{public sbstract int sum(int a,int b);//int sum(int a,int b);
}public class CalculatorImpl implements Calculator{public int sum(int a,int b){return a+b;}
}public static void main(String[] args){Calculator calculator=new CalculatorImpl();method(calculator);//等于method((a,b) -> a+b);
}public static void method(Calculator calculator){int result=calculator.sum(1,2);System.out.println(result);
}

View Code

  方法引用:

    防止Lambda表达式的代码冗余。

    若Lambda表达式定义的动作在其他类中已经定义,那么使用方法引用来解决。

    第一种:类名引用静态方法格式

      类名::静态方法

    第二种:对象名引用成员方法格式

      对象名::成员方法名

实例:

@FuncationalInterface
pulic interface Calculator{void show(string str);
}public class Test{public static void methodShow(String str){System.out.println(str);}
}public static void main(String[] args){method(str -> System.out.println(str));//或者
    method(Test::methodShow);//或者Test test=new Test();method(test::methodShow);//或者method(System.out::println);//System.out其实就是jdk创建好的对象,println时System.out的成员方法/*总结:1、一定要有函数式接口,才能使用lambda2、对于重复的lambda场景,可以使用方法引用来进行简化。*/
}public static void method(Calculator calculator){calculator.show("内容");
}

实例:使用 集合for遍历冗余场景 去掉成绩不及格的成员

ArrayList<String> arr=new ArrayList<String>();
arr.add("a,90");
arr.add("ab,70");
arr.add("abc,50");//截取
ArrayList<String> scoreList=new ArrayList<String>();
for(int i=0;i>arr.size();i++){String[] strList=arr.get(i);String score=strList[1];scoreList.add(score);
}//String转int
ArrayList<Integer> numList=new ArrayList<Integer>();
for(int i=0;i<scoreList.size(); i++){y8int num=Integer.parseInt(scoreList.get(i));numList.add(num);
}//过滤
ArrayList<String> resultList=new ArrayList<String>();
for(int i=0; i<numList.size(); i++){int num=numList.get(i);if(num>60){resultList.add(num);}
}//打印输出
for(int i=0; i<resultList.size();i++){System.out.println(resultList.get(i));
}

View Code

//java8的简化stream流式操作
ArrayList<String> arr=new ArrayList<String>();
arr.add("a,90");
arr.add("ab,70");
arr.add("abc,50");//Stream API更优写法   map映射   filter过滤  forEach遍历
arr.stream().map(s -> s.split(",")[1]).map(Integer::parseInt)
.filter(n -> n>60).forEach(System.out::println);

Stream API 流式操作

  Java 8当中的“流”其实就是Stream接口的对象。

  JDK提供了一个流接口,java.util.stream.Stream<T>

  获取流的方式:

    1、根据集合获取流:集合对象名称.stream();

    2、分解数组获取流:Stream.of(数组名称)  数组当中的元素必须是引用类型

//实例1
ArrayList<String> arr=new ArrayList<String>();
arr.add("a");
arr.add("ab");
arr.add("abc");Stream<String> streamA=arr.stream();//实例2
String[] strList={"","",""};
Stream<String> streamS=Stream.of(strList);

  流的映射map:

    获取流之后,使用映射方法:map(用于转换的Lambda表达式)

    映射:就是将一个对象转换成为另一个对象,把老对象映射到新对象上。

ArrayList<String> arr=new ArrayList<String>();
arr.add("1");
arr.add("2");
arr.add("3");Stream<Integer> streamA=arr.stream().map((String str) -> {int num=Integer.parseInt(str);return num;
});
//简化 详细步骤如下:
streamA=arr.stream().map(str -> {int num=Integer.parseInt(str);return num;
});
streamA=arr.stream().map(str -> {return Integer.parseInt(str);
});
streamA=arr.stream().map(Integer::parseInt);//方法引用

实例:

ArrayList<String> arr=new ArrayList<String>();
arr.add("a,90");
arr.add("ab,70");
arr.add("abc,50");//Lambda的标准写法
Stream<String> streamA=arr.stream().map((String s) -> {String[] strList=s.split(",");String result=strList[1];return result;
});//简化 步骤:
streamA=arr.stream().map(s -> {String[] strList=s.split(",");String result=strList[1];return result;
});
streamA=arr.stream().map(s -> {String[] strList=s.split(",");return strList[1];
});
streamA=arr.stream().map(s -> {return s.split(",")[1];
});
streamA=arr.stream().map(s -> s.split(",")[1]);

View Code

  filter 过滤

    filter 能产生boolean结果的Lambda;true则取,false则丢

ArrayList<String> arr=new ArrayList<String>();
arr.add(90);
arr.add(70);
arr.add(50);Stream<Integer> streamA=arr.stream().filter((int num) -> {boolean b=num>60;return num;
});
//简化 步骤:
streamA=arr.stream().filter(num -> {boolean b=num>60;return num;
});
streamA=arr.stream().filter(num -> {return num>60;
});
streamA=arr.stream().filter(num -> num>60);

  forEach 遍历

    forEach(Lambda表达式);

       参数Lambda表达式必须是一个能够消费的一个参数,而且不产生结果的Lambda表达式。

ArrayList<String> arr=new ArrayList<String>();
arr.add(90);
arr.add(70);
arr.add(50);Stream<Integer> streamA=arr.stream().forEach((int i) -> {System.out.println(i);
});
//简化 步骤:
streamA=arr.stream().forEach(i -> {System.out.println(i);
});
streamA=arr.stream().forEach(i -> System.out.println(i));
streamA=arr.stream().forEach(System.out::println);

  并发(Paralle)流

    对流中的元素进行多个人同时处理,这就是并发。

ArrayList<String> arr=new ArrayList<String>();
//获取一个并发流
arr.parallelStream().........
//或  若已经获取一个普通流,那么只要再调用一下parallel()也会变成并发流
arr.stream().parallel()......

转载于:https://www.cnblogs.com/zltao/p/10385425.html

.Net转Java自学之路—基础巩固篇二十(Lambda)相关推荐

  1. .Net转Java自学之路—基础巩固篇一

    一.基础常用dos命令行: 1.dir:陈列目录下的文件及文件夹 2.md:创建目录 3.rd:删除目录 4.cd:进入制定目录 5.cd..:返回上一级目录 6.cd\:退回跟目录 7.del:删除 ...

  2. .Net转Java自学之路—基础巩固篇十八(正则)

    正则表达式: 正则就是用于操作字符串的规则.其中是以一些符号来标识规则. 字符类: [] :范围 - :连接符 ^ :非 预定义字符类: . :任何字符 \d :数字 \D :非数字 \s :空白字符 ...

  3. .Net转Java自学之路—基础巩固篇八—总结(封装、继承、多态)

    巴拉巴拉 转载于:https://www.cnblogs.com/zltao/p/9074944.html

  4. .Net转Java自学之路—Spring框架篇二(IOC注解、AOP)

    Spring的Bean操作(注解方式): 注解:代码中特殊的标记,使用注解可以完成相关功能. @注解名称(属性名称=属性值) 注解可以使用在类.方法.属性上面. 主要用途:可以替代配置文件来创建对象和 ...

  5. .Net转Java自学之路—Hibernate框架篇三(查询方式)

    Hibernate查询方式: 1.对象导航查询:根据id查询出一的数据,再根据一的查询结果查询多的数据. OnlyClass only=session.get(OnlyClass.class,1); ...

  6. .Net转Java自学之路—SpringMVC框架篇八(RESTful支持)

    RESTful架构,REST即Representational State Transfer.表现层状态转换,就是目前最流行的一种互联网软件架构.它结构清晰.符合标准.易于理解.扩展方便,所以得到越来 ...

  7. 零基础 Java 自学之路(2021年最新版)

    前言 无论你是否想自学 Java,认真看完本文,你以后的职场生涯至少少走1年弯路. 本文会持续更新,建议收藏. 初衷 在 CSDN 上经常有同学私聊我询问 "如何自学 Java". ...

  8. JAVA自学之路 [原创 - 尚学堂科技 - 马士兵老师]

    (我觉得看了之后挺不错的所以分享一下) JAVA自学之路 一:学会选择 为了就业,不少同学参加各种各样的培训. 决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3 ...

  9. JAVA自学之路——马士兵

    JAVA自学之路--马士兵  2007年11月06日 星期二 05:47 P.M.[原创 - 尚学堂科技 - 马士兵老师]    JAVA自学之路 一:学会选择  [转载请注明出处:http://ww ...

最新文章

  1. 《 嵌入式系统设计与实践》一一3.6 测试硬件(和软件)
  2. 寄存器位查看小工具.exe
  3. 为什么需要批判性思维 -- 读《学会提问》
  4. Xamarin Essentials教程地理定位Geolocation
  5. java基础----Base64算法的使用
  6. Python变量本质
  7. Zookeeper面试题
  8. React开发(178):ant design table基础用法
  9. ligerGrid简单例子--通过后台转数据
  10. AI学习笔记(二)图像与视频
  11. python html5 便利店收银系统_简单又好用的便利店收银系统
  12. 5个 GIS空间分析 空间查询与量算 的重要知识点
  13. 虚拟机下修改hosts文件
  14. Cadence封装尺寸总结
  15. 生命以负熵为生:浅析零知识证明
  16. 如何在Linux上玩游戏
  17. android 仿微信头像裁剪,android 模仿微信头像裁剪
  18. 虚拟机上无法运行ubuntu自带的gazebo仿真器报VMware: vmw_ioctl_command error 无效的参数
  19. JavaScript(九)
  20. Codeforces 1129 E.Legendary Tree

热门文章

  1. 操作系统作业3 xv6 CPU alarm
  2. Jquery 同个类名中点击的显示其他隐藏的效果
  3. EasyPlayer Android RTSP播放器延迟再优化策略
  4. 什么是软件测试?和软件开发又有什么区别?
  5. Linux下如何发现内存泄漏问题(测试角度)
  6. matlab predict函数并行,Matalb 智能算法第29个案例运行报错问题
  7. 06-03 Jenkins 节点管理(Linux)
  8. Mysql数据库小结
  9. 快速入门Web前端开发的正确姿势
  10. Oracle修改globalname,oracle修改global_name和service_name