.Net转Java自学之路—基础巩固篇二十(Lambda)
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)相关推荐
- .Net转Java自学之路—基础巩固篇一
一.基础常用dos命令行: 1.dir:陈列目录下的文件及文件夹 2.md:创建目录 3.rd:删除目录 4.cd:进入制定目录 5.cd..:返回上一级目录 6.cd\:退回跟目录 7.del:删除 ...
- .Net转Java自学之路—基础巩固篇十八(正则)
正则表达式: 正则就是用于操作字符串的规则.其中是以一些符号来标识规则. 字符类: [] :范围 - :连接符 ^ :非 预定义字符类: . :任何字符 \d :数字 \D :非数字 \s :空白字符 ...
- .Net转Java自学之路—基础巩固篇八—总结(封装、继承、多态)
巴拉巴拉 转载于:https://www.cnblogs.com/zltao/p/9074944.html
- .Net转Java自学之路—Spring框架篇二(IOC注解、AOP)
Spring的Bean操作(注解方式): 注解:代码中特殊的标记,使用注解可以完成相关功能. @注解名称(属性名称=属性值) 注解可以使用在类.方法.属性上面. 主要用途:可以替代配置文件来创建对象和 ...
- .Net转Java自学之路—Hibernate框架篇三(查询方式)
Hibernate查询方式: 1.对象导航查询:根据id查询出一的数据,再根据一的查询结果查询多的数据. OnlyClass only=session.get(OnlyClass.class,1); ...
- .Net转Java自学之路—SpringMVC框架篇八(RESTful支持)
RESTful架构,REST即Representational State Transfer.表现层状态转换,就是目前最流行的一种互联网软件架构.它结构清晰.符合标准.易于理解.扩展方便,所以得到越来 ...
- 零基础 Java 自学之路(2021年最新版)
前言 无论你是否想自学 Java,认真看完本文,你以后的职场生涯至少少走1年弯路. 本文会持续更新,建议收藏. 初衷 在 CSDN 上经常有同学私聊我询问 "如何自学 Java". ...
- JAVA自学之路 [原创 - 尚学堂科技 - 马士兵老师]
(我觉得看了之后挺不错的所以分享一下) JAVA自学之路 一:学会选择 为了就业,不少同学参加各种各样的培训. 决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3 ...
- JAVA自学之路——马士兵
JAVA自学之路--马士兵 2007年11月06日 星期二 05:47 P.M.[原创 - 尚学堂科技 - 马士兵老师] JAVA自学之路 一:学会选择 [转载请注明出处:http://ww ...
最新文章
- 《 嵌入式系统设计与实践》一一3.6 测试硬件(和软件)
- 寄存器位查看小工具.exe
- 为什么需要批判性思维 -- 读《学会提问》
- Xamarin Essentials教程地理定位Geolocation
- java基础----Base64算法的使用
- Python变量本质
- Zookeeper面试题
- React开发(178):ant design table基础用法
- ligerGrid简单例子--通过后台转数据
- AI学习笔记(二)图像与视频
- python html5 便利店收银系统_简单又好用的便利店收银系统
- 5个 GIS空间分析 空间查询与量算 的重要知识点
- 虚拟机下修改hosts文件
- Cadence封装尺寸总结
- 生命以负熵为生:浅析零知识证明
- 如何在Linux上玩游戏
- android 仿微信头像裁剪,android 模仿微信头像裁剪
- 虚拟机上无法运行ubuntu自带的gazebo仿真器报VMware: vmw_ioctl_command error 无效的参数
- JavaScript(九)
- Codeforces 1129 E.Legendary Tree