Lambda Expressions 笔记

随Java 8发布,"The Java(TM) Tutorials"增加了关于“Lambda Expressions”的教程。本文是此教程的总结、摘要。

一、Lambda的实质是一个匿名类

二、Lambda公式只能实现 functional 接口;
  1. 只有一个虚方法的借口,叫做 functional 接口;
  2. functional 接口中可以有一个或多个默认方法和静态方法。

三、Lambda公式的格式

例如:

p -> p.getGender() == Person.Sex.MALE
    && p.getAge() >= 18
    && p.getAge() <= 25

  1. "->"是Lambda公式的标记,左边是参数表,右边是方法体;

  2. 参数表
    a. Lambda的参数表类似方法的参数表,圆括号包裹,逗号间隔。如:(p, q, r);
    b. 参数可以有、但是不必有类型修饰,编译器会自己判断参数类型;
    c. 只有一个参数可以省略括弧;
    d. 如果对应的方法没有参数,则Lambda的参数表写为"() -> "。

  3. 方法体
    a. 同一般方法的方法体;
    b. 如果有多条语句,用{}包裹;
    c. 如果有多条语句,方法要求返回结果,则最后一句用 return 。

四、java 8 在java.util.function 中预定义了一些functionl 接口,大致有:

@FunctionalInterface
public interface Consumer<T> {
    void accept(T t);
    default Consumer<T> andThen(Consumer<? super T> after) {
        Objects.requireNonNull(after);
        return (T t) -> { accept(t); after.accept(t); };
    }
}

@FunctionalInterface
public interface Predicate<T> {
    boolean test(T t);

    default Predicate<T> and(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) && other.test(t);
    }

    default Predicate<T> negate() {
        return (t) -> !test(t);
    }

    default Predicate<T> or(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) || other.test(t);
    }

    static <T> Predicate<T> isEqual(Object targetRef) {
        return (null == targetRef)
            ? Objects::isNull
            : object -> targetRef.equals(object);
    }
}

@FunctionalInterface
public interface Function<T, R> {
    R apply(T t);

    default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
        Objects.requireNonNull(before);
        return (V v) -> apply(before.apply(v));
    }

    default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
        Objects.requireNonNull(after);
        return (T t) -> after.apply(apply(t));
    }

    static <T> Function<T, T> identity() {
        return t -> t;
    }
}

五、借助于 java.util.stream 包中定义的流和管道,可以实现聚合操作(Aggregate Operations),如:

roster
.stream()
.filter(
    p -> p.getGender() == Person.Sex.MALE
    && p.getAge() >= 18
    && p.getAge() <= 25)
.map(p -> p.getEmailAddress())
.forEach(email -> System.out.println(email));

Lambda Expressions 笔记

时间: 2024-10-14 03:36:59

Lambda Expressions 笔记的相关文章

Java 8 Lambda Expressions by Examples

Ever since I heard Java 8 is going to support lambda expressions (aka closures), I was very enthusiastic to spice my code with such a decent and concise functional element. Most developers extensively use Anonymous Inner Classes for event handlers, c

java 8之Lambda Expressions 解说

java 8之Lambda Expressions 解说 java 8 新增Lambda Expressions 的目的:为了使代码简洁易读和消除过多的冗余代码(尽量让编译器做代码转换工作,也可以认为是语法糖之类的作用). 使用过c.c++语言的人,都记得,他们的函数参数可以是函数指针即代码片段(某些行为),而在java语言中,要想使得函数为参数,必须把函数封装成对象,以对象传参才可以.而 java 8 新增Lambda Expressions 使得这一现状得到缓解(函数式变成.闭包之类的概念都

jdk8新特性之lambda expressions

本文分两部分: 语法简单说明 lambda的使用 注:这两部分内容均以类+注释的方式进行说明,并且内容均来自官方教程(https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html). 第一部分: /** * 语法说明类 * * lambda表达式包含下面几个要素: * 1.逗号分隔的参数列表,如CheckPerson.test(Person p),其中p表示一个Person的对象实例 * 2.向右箭头 →,

When to Use Nested Classes, Local Classes, Anonymous Classes, and Lambda Expressions

As mentioned in the section  Nested Classes, nested classes enable you to logically group classes that are only used in one place, increase the use of encapsulation, and create more readable and maintainable code. Local classes, anonymous classes, an

Hacking Lambda Expressions in Java

Hacking Lambda Expressions in Javahttps://dzone.com/articles/hacking-lambda-expressions-in-java At the bytecode level, a lambda expression is replaced with an invokedynamic instruction. This instruction is used to create implementations of a function

lambda expressions

lambda: Java lambda表达式是Java 8中的新增功能.Java lambda表达式是Java进入函数式编程的第一步.因此,Java lambda表达式是一个可以在不属于任何类的情况下创建的函数.Java lambda表达式可以作为对象传递,并按需执行. Java lambda表达式通常用于实现简单的事件侦听器/回调,或者使用Java Streams API进行函数式编程. lambda expressions的使用: 很多时候我们在使用Lambda表达式查询时,比如使用Lamb

Other - 07 - Lambda学习笔记 - Lambda

Stream 如果说 Lambda 对于 Java 是语法上的一个改进,那么 Stream 就是对于 Java 容器集合的改进. Stream 流是一个值序列的抽象,它位于 java.util.stream 包下,它代表着一系列的值,它和 Java 集合容器具有一些相同的特性,但是它们有着本质的不同. 集合容器是存储值的,而流是一个值的视图,它不存储值,它是值的一组镜像. 集合是有限的,而流可以是有限的也可以是无限的. 流提供了许多方便的聚集操作,而且有可能是并行的聚集,比集合容器来说一些情况下

Other - 06 - Lambda学习笔记 - Lambda

Lambda 通过上篇我们基本可以看出来 Lambda 是一个行为非常类似匿名内部类的一个东西,而实际上它大部分时候都是在取代匿名内部类来实现更加简洁的语法. 可以看到这是一个简单的使用 Lambda 去代替 Comparator 匿名类来进行排序的例子. 首先第一是代码变的更加紧凑了,原先需要使用四行半的代码现在半行就搞定,但这不是最重要的,重要的是这种从四行半缩短到半行可以让我们的代码更加容易的进行链式操作. 可以看到如果仍然使用匿名类,那么这个代码就非常的难看了,但是使用 Lambda 就

Lambda Expressions表达式使用

很多时候我们在使用Lambda表达式查询时,比如使用Lambda表达式查询用户数据,有时候会用电话或邮箱去查询用户信息,有时候又会用户名去查询用户信息 var user = db.Set<U_User>().Where(c => c.UserName = "nee32"); var user = db.Set<U_User>().Where(c => c.TelePhone = "13888888888"); 其实查询的结果都一样