java8新特性 (λ、stream 与 默认接口方法)

1.lambda

λ表达式本质上是一个匿名方法,用来方便地实现函数接口。也就是说,λ表达式主要用于替换以前广泛使用的内部匿名类。 
让我们来看下面这个例子:
    public int add(int x, int y) {
        return x + y;
    }
转成λ表达式后是这个样子:
    (int x, int y) -> x + y;
参数类型也可以省略,Java编译器会根据上下文推断出来:
    (x, y) -> x + y; //返回两数之和
或者
    (x, y) -> { return x + y; } //显式指明返回值

λ表达式由三部分组成:参数列表,箭头(->),以及一个表达式或语句块。

λ表达式的类型,叫做“目标类型(target type)。λ表达式的目标类型是“函数接口(functional interface),这是Java8新引入的概念。它的定义是:一个接口,如果只有一个显式声明的抽象方法,那么它就是一个函数接口。一般用@FunctionalInterface标注出来(也可以不标)。举例如下:
public interface Runnable { void run(); }
public interface Comparator<T> { int compare(T o1, T o2);}

lambda不是匿名内部类的语法糖,见下。

package com.yichudu;

public class A {
	public static void main(String[] args) {
		//使用匿名内部类,编译后会有A$1.class的存在
		Thread t1=new Thread(new Runnable() {

			@Override
			public void run() {
				System.out.print(123);

			}
		} );
		//use lambda expression,no extra class generates.
		Thread t2=new Thread(()->{System.out.print(123);});
	}
}

2.stream

Stream<E> java.util.Collection.stream()
返回Stream对象。

Stream<T> java.util.stream.Stream.filter(Predicate<? super T> predicate)
从stream中过滤元素,返回的stream由与谓词匹配的元素组成。
void java.util.stream.Stream.forEach(Consumer<? super T> action)
对stream中的每一个元素执行action。

boolean java.util.function.Predicate.test(T t)
Predicate接口中的方法,评估给定元素是否满足谓词。

void java.util.function.Consumer.accept(T t)
Consumer接口中的方法,此方法对给定的元素进行操作。

3.默认接口方法

通过default关键字给接口的方法提供默认实现。

这样与抽象类的普通方法就差别不大了。

java.util.Collection接口的源代码含有下面的默认接口实现。
  default Stream<E> stream() {
        return StreamSupport.stream(spliterator(), false);
    }

时间: 2024-10-02 03:27:08

java8新特性 (λ、stream 与 默认接口方法)的相关文章

JAVA8新特性

总结提高,与君共勉 上次在一个同学的面经看到,被问到了JAVA8新特性,这个总结不好,转载一篇神文,一起来了解了解 本教程将Java8的新特新逐一列出,并将使用简单的代码示例来指导你如何使用默认接口方法,lambda表达式,方法引用以及多重Annotation,之后你将会学到最新的API上的改进,比如流,函数式接口,Map以及全新的日期API "Java is still not dead-and people are starting to figure that out." 本教程

java8 新特性之 Lambda 讲解教程

什么是Lambda Lambda 是个新的特性添加到java的jdk中,说明了java对其它语言的支持,吸收其它语言先进的方法.Lambda 表达在java中提供了类型的引用,方法的引用,和默认方法. 对于Lambda的解释在wiki百科看到了就不做翻译保留原味(看看大家的理解,有不同的看法欢迎探讨)Lambda (programming), a function (or a subroutine) defined, and possibly called, without being boun

java8新特性整理

java9快来了,必须得梳理一下java8了. 官方文档:http://docs.oracle.com/javase/specs/jls/se8/html/index.html 一.接口的默认方法和静态方法 接口里也可以写方法体了,实现该接口的类不再强制实现该方法,只需要在方法签名增加default签名并实现方法体,如: 接口: public interface Compute { default Integer add(Integer x,Integer y) { return x+y; }

What&#039;s New in JDK 8 java8新特性汇总

    Oracle甲骨文公司终于在2014年3月发布了Java 8正式版,它是java的一个里程牌版本,带来了诸多新特性.      针对这些新特性汇总如下: 一.针对java编程语言(Java Programming Language)     1.lambda表达式:一种新的语言特性,能够把函数作为方法的参数或将代码作为数据.lambda表达式使你在表示函数接口(具有单个方法的接口)的实例更加紧凑. public class Calculator { interface IntegerMa

Java8新特性lambda表达式有什么用(用法实例)_java

我们期待了很久lambda为java带来闭包的概念,但是如果我们不在集合中使用它的话,就损失了很大价值.现有接口迁移成为lambda风格的问题已经通过default methods解决了,在这篇文章将深入解析Java集合里面的批量数据操作(bulk operation),解开lambda最强作用的神秘面纱. 1.关于JSR335 JSR是Java Specification Requests的缩写,意思是Java 规范请求,Java 8 版本的主要改进是 Lambda 项目(JSR 335),其

详谈Java8新特性泛型的类型推导_java

1. 泛型究竟是什么? 在讨论类型推导(type inference)之前,必须回顾一下什么是泛型(Generic).泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.通俗点将就是"类型的变量".这种类型变量可以用在类.接口和方法的创建中.理解Java泛型最简单的方法是把它看成一种便捷语法,能节省你某些Java类型转换(casting)上的操作: List<Apple> box = new ArrayList<Ap

Java8新特性之Lambda表达式浅析_java

说到java 8,首先会想到lambda(闭包)以及虚拟扩展方法(default method),这个特性早已经被各大技术网站炒得沸沸扬扬了,也是我们java 8系列开篇要讲的第一特性(JEP126 http://openjdk.java.net/jeps/126),jdk8的一些库已经应用了lambda表达式重新设计了,理解他对学习java 8新特性有着重要的意义. 一.函数式接口 函数式接口(functional interface 也叫功能性接口,其实是同一个东西).简单来说,函数式接口是

Java8新特性之字符串去重介绍_java

8月19日,Oracle发布了JDK 8u20,JDK 8u20包含很多新特性,比如Java编译器更新.支持在运行时通过API来修改MinHeapFreeRatio和MaxHeapFreeRatio参数.新的GC调优指南文档.不过在众多新特性中,最令人期待的还属字符串去重(String Deduplication ).如何减少内存占用一直是一个永恒的话题,而在Java应用中,经常会看到String对象会占用应用30%的内存,它是Java中最常用的对象之一.新的字符串去重特性可以帮助减少应用中St

Java8新特性之默认方法(default)浅析_java

一.什么是默认方法,为什么要有默认方法 简单说,就是接口可以有实现方法,而且不需要实现类去实现其方法.只需在方法名前面加个default关键字即可. 为什么要有这个特性?首先,之前的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,当需要修改接口时候,需要修改全部实现该接口的类,目前的java 8之前的集合框架没有foreach方法,通常能想到的解决办法是在JDK里给相关的接口添加新的方法及实现.然而,对于已经发布的版本,是没法在给接口添加新方法的同时不影响已有的实现.所以引进的默认方法