Java 8特性学习 --- Lambda表达式
来源:互联网 发布:如何查看电脑远程端口 编辑:程序博客网 时间:2024/05/20 05:26
文章内容
1.匿名类
2.函数式接口
3.lambda表达式
4.lambda表达式、函数接口和Stream接口在数据处理上的运用
1.匿名类
匿名类,即没有名字的类,只能使用一次,匿名类的实现主要通过两种方式:继承和接口,需要注意的是匿名类由于没有类类型,对外可见的属性和方法必须是在父类或接口中定义;
①继承方式实现
继承父类病重写父类方法,本应该是新的类,如果只是临时使用不需要创建新的类类型,直接在实例化时重写父类方法;
public class Parent { public void print(){ System.out.println("parent"); }}Parent p1 = new Parent(){ @Override public void print(){ System.out.println("extends:AnysMain"); }};
②接口方式实现
接口的实现根据具体的调用上下实现决定,没有固定的实现;在使用时,定义接口类型并实现接口方法;也就成了匿名的实现类;
public interface IParent { public void print();}IParent p2 = new IParent(){ @Override public void print() { System.out.println("interface:AnysMain"); } };p2.print();
2.函数式接口
只有一个特有抽象方法的接口(不包括继承来的接口),@FunctionalInterface,简称FI;
@FunctionalInterfacepublic interface IFuncInterface { public void print();}
在Java8中与lambda表达式相关的函数式接口:
①Predicate接口(逻辑判断)
虽然Predicate接口有5个方法,但是除了test方法,其他方法都属于默认方法(default修饰的抽象方法,有默认实现),则在创建接口相关的实例时只需要实现test方法;
//Returns a predicate which evaluates to true only if this predicate//and the provided predicate both evaluate to true.and(Predicate<? super T> p) //Returns a predicate which negates the result of this predicate.negate() //Returns a predicate which evaluates to true if either//this predicate or the provided predicate evaluates to trueor(Predicate<? super T> p) //Returns true if the input object matches some criteriatest(T t) //Returns a predicate that evaluates to true if both or neither//of the component predicates evaluate to truexor(Predicate<? super T> p)
②Consumer接口(附加操作)
Consumer接口有两个方法,同样的只有一个抽象方法accept,用于接收参数并对参数进行操作;
/** * Performs this operation on the given argument. */ void accept(T t);/** * 完成链式操作 */default Consumer<T> andThen(Consumer<? super T> after) { Objects.requireNonNull(after); return (T t) -> { accept(t); after.accept(t); }; }
③Function接口(对象操作)
对对象T进行处理并返回独享R,唯一的抽象方法为apply,除此之外还有附属的操作,比如andThen、compose、identity;
④Supplier 接口(提供对象)
用于返回一个泛型T对象;
⑤Comparator 接口(比较规则)
Comparator接口是一个经典的接口,一般自定义的比较规则都是通过Comparator接口来实现的;除了一个compare(T o1, T o2)方法,Java8中实现了大量的默认方法;
除了以上常用函数接口,还有一些其他有用的Java8提供的新特性;
⑥Optional 接口
Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
Optional 类的引入很好的解决空指针异常。
在大量数据处理的过程中,会不可避免的出现null的问题,使用Optional接口可以很好的简化对null的判断;
一般通过Optional提供的静态方法of/ofNullable封装实例对象;
//java.util.Optional<T> 类的声明public final class Optional<T> extends Object
⑦Stream 接口
java.util.Stream 表示能应用在一组元素上一次执行的操作序列,用于对集合类型完成一系列操作,包括过滤、遍历;重点是可以由集合生成stream和parallelStream两种类型的流,parallelStream支持并行计算分而治之,将多个中间操作划分到不同的线程来完成
Filter过滤:过滤通过一个predicate接口来过滤并只保留符合条件的元素,该操作属于中间操作,所以我们可以在过滤后的结果来应用其他Stream操作;
Sort排序:排序是一个中间操作,返回的是排序好后的Stream。如果你不指定一个自定义的Comparator则会使用默认排序(需要集合类型实现Comparable接口);
Map映射:中间操作map会将元素根据指定的Function接口来依次将元素转成另外的对象;
Match匹配:Stream提供了多种匹配操作(allMatch/anyMatch),所有的匹配操作都是最终操作,并返回一个boolean类型的值。
Count计数:计数是一个最终操作,返回Stream中元素的个数,返回值类型是long。
Reduce规约:这是一个最终操作,允许通过指定的函数来讲stream中的多个元素规约为一个元素,规越后的结果是通过Optional接口表示的;
//stream相关操作List<Example> list = new ArrayList<Example>();list.add(new Example(3, "alice"));list.add(new Example(4, "eric"));list.add(new Example(5, "luice"));list.add(new Example(1, "tom"));list.add(new Example(2, "bob"));//countSystem.out.println(list.stream().count());//matchSystem.out.println(list.stream().allMatch((e)->e.index > 0));//reduceSystem.out.println(list.stream().reduce((before,next)->{before.name = before.name+"/"+next.name;return before;}).get().name);System.out.println(list.stream().reduce(new Example(-1,""),(before,next)->{before.name = before.name+"/"+next.name;return before;}).name);//sortedlist.stream().sorted((e1,e2)->{return e1.index - e2.index;}).forEach((e) -> {System.out.println(e.name);});
3.lambda表达式
lambda表达式是匿名方法,它提供了轻量级的语法,从而解决了匿名内部类带来的“高度问题”,是Java8提供的一种很轻量的语法规则;
(int x, int y) -> x + y() -> 42(String s) -> { System.out.println(s); }
第一个lambda表达式接收x和y这两个整形参数并返回它们的和;第二个lambda表达式不接收参数,返回整数’42’;第三个lambda表达式接收一个字符串并把它打印到控制台,不返回值。
lambda表达式的语法由参数列表、箭头符号->和函数体组成。函数体既可以是一个表达式,也可以是一个语句块:
表达式:表达式会被执行然后返回执行结果。
语句块:语句块中的语句会被依次执行,就像方法中的语句一样——
return语句会把控制权交给匿名方法的调用者
break和continue只能在循环中使用
如果函数体有返回值,那么函数体内部的每一条路径都必须返回值
表达式函数体适合小型lambda表达式,它消除了return关键字,使得语法更加简洁。
4.lambda表达式、函数接口和Stream接口在数据处理上的运用
借助lambda表达式在语法上简洁、以及函数接口的设计,可以完成复杂的数据处理逻辑;特别的,对于集合类数据(目前大部分数据来源为集合),Java8提供了Stream接口,并且定义了Sorted、Match、Filter等中间操作实现对数据的过滤;以及Count、Map、Reduce等最终操作完成对数据的聚合处理;
参考文章
深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法
- Java 8特性学习 --- Lambda表达式
- Java 8 新特性之 Lambda 表达式
- Java 8新特性:lambda表达式
- Java 8 新特性 Lambda表达式
- Java 8 新特性:Lambda 表达式
- Java JDK1.8新特性Lambda 表达式
- Java 8 新特性之 Lambda表达式
- W3Cschool Java 8新特性----> Lambda 表达式
- Java 8新特性:lambda表达式
- Java 8 新增特性Lambda表达式
- java 8 lambda 表达式 学习
- JAVA 新特性:lambda表达式
- Java新特性 lambda表达式
- Java 高级特性: Lambda 表达式
- JAVA 1.8 新特性学习(2) lambda表达式
- java学习(lambda表达式)
- JDK 8新特性学习之Lambda表达式
- Java 8新特性:lambda表达式(四)转载总结
- NYOJ 915 +-字符串
- 未知:zi——题解
- Java中如何遍历Map对象的4种方法
- 中兴技术一面
- 【bzoj5015】[Snoi2017]礼物
- Java 8特性学习 --- Lambda表达式
- 视频解码库CUVID流程
- 《android开发艺术探索笔记》Part11、Android的线程和线程池
- 反序列化(先序)——split : string-->vector<string>
- 日常笔记之AP
- 常用 Git 命令清单
- html+js图片轮播包含背景音乐
- ES6--字符串的扩展
- 关于动态修改react-navigation各种属性方式