java8之lambda表达式看这一篇就够了

 java8增加了许多新特性,其中lambda表达式可以说为最重要的特性之一,本文将从如下几个方面来学习lambda:

    1、lambda表达式的基本定义

  2、lambda表达式的语法

  3、lambda表达式基本示例

一、何为lambda表达式?

  简单点说lambda为一种匿名函数,它既没有名字也没有声明的方法、访问修饰符和返回值等。它允许将函数作为方法的参数进行传递。

二、基本语法:lambda通常包含如下几种书写方式

  () -> expression

  () -> {  statement  }

  () -> { statements }

  (arg1,arg2) -> { statement }

  (Type arge1,Type arge2) -> { statement }

三、jdk内置的函数式接口以及基本示例介绍

  jdk内置了如下四大函数式接口,在java.util.function包下可以找到:

  1、Function  接收一个参数类型 T , 返回类型 R ,适用于包装、修改等操作

@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;
    }
}

  下面的代码演示了如何获取一个学生的所有名字:

 public static void main(String[] args) {
        Student student1 = new Student("a",11);
        Student student2 = new Student("b",12);
        Student student3 = new Student("c",21);
        Student student4 = new Student("d",1);
        List<Student> students = new ArrayList <>();
        students.add(student1);
        students.add(student2);
        students.add(student3);
        students.add(student4);
        List < String > names = filterStudent(students , student -> student.getName());
        names.forEach((name)-> System.out.println(name));
    //输出结果:a b c d
    }

    public static <T,R> List<R> filterStudent(List<T> list, Function<T,R > function){
        List<R> names = new ArrayList <>();
         for (T t : list) {
             names.add(function.apply(t));
        }
        return names;
    }

  2、Consumer 接收一个参数 类型T ,无返回值 ,适用于遍历等操作

@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); };
    }
}

  适用于遍历,最典型的 foreach 示例:

 1         List<String> list = new ArrayList <>();
 2         list.add("a");
 3         list.add("b");
 4         list.add("c");
 5         list.add("d");
 6         list.forEach((str)->System.out.println(str));
 7         //直接调用类的方法进行输出
 8         list.forEach(System.out::println);
 9
10         list.forEach((str)->{
11             //若为一个对象,可以进行其余的保存、更新等操作
12             System.out.println(str);
13         });

  

  3、Predicate 接受一个参数T ,返回boolean,适用于判断过滤等操作

 1 @FunctionalInterface
 2 public interface Predicate<T> {
 3
 4     boolean test(T t);
 5
 6     default Predicate<T> and(Predicate<? super T> other) {
 7         Objects.requireNonNull(other);
 8         return (t) -> test(t) && other.test(t);
 9     }
10
11
12     default Predicate<T> or(Predicate<? super T> other) {
13         Objects.requireNonNull(other);
14         return (t) -> test(t) || other.test(t);
15     }
16
17
18     static <T> Predicate<T> isEqual(Object targetRef) {
19         return (null == targetRef)
20                 ? Objects::isNull
21                 : object -> targetRef.equals(object);
22     }
23 }

下面的代码演示了 Predicate 接口的基本用法:

 1  public static void main(String[] args) {
 2         Student student1 = new Student("a",11);
 3         Student student2 = new Student("b",12);
 4         Student student3 = new Student("c",21);
 5         Student student4 = new Student("d",1);
 6         List<Student> students = new ArrayList <>();
 7         students.add(student1);
 8         students.add(student2);
 9         students.add(student3);
10         students.add(student4);
11         List < Student > students1 = testStudent(students , student -> student.getAge() > 11);
12         students1.forEach(student -> System.out.println(student.getName()));
13      //输出结果:b c
14     }
15
16     public static <T> List<T> testStudent(List<T> list , Predicate<T> function){
17         List<T> newList = new ArrayList <>();
18         for (T t : list) {
19             if(function.test(t)){
20                 newList.add(t);
21             }
22         }
23         return newList;
24     }

4、Supplier 无参数,返回一个结果

1 @FunctionalInterface
2 public interface Supplier<T> {
3
4     T get();
5
6 }

  从上面的四个函数式接口中我们可以总结出如下几点:

  1、函数式接口一般都有 @FunctionalInterface 注解标识,但是此注解并非强制需要,如果不标注的话编译器将无法识别只能拥有一个未实现的方法

  2、函数式接口之接受唯一的 public 方法 ,但是允许有 default 方法 、静态方法以及 父类Object的方法(如果声明第二个public方法会直接报错,大家可以试一下)。

  函数式接口的使用一般会配合 java中Stream Api进行使用,下篇文章将会讲解java中Stream流的处理。

  

原文地址:https://www.cnblogs.com/dhjmjava/p/10367557.html

时间: 2024-09-28 22:42:07

java8之lambda表达式看这一篇就够了的相关文章

Java中的多线程你只要看这一篇就够了

Java中的多线程你只要看这一篇就够了 引 如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其实只有一半对,因为反应"多角色"的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的"生产者,消费者模型". 很多人都对其中的一些概念不够明确,如同步.并发等等,让我

iOS动画详解(学习动画看这一篇就够了)

iOS动画详解(学习动画看这一篇就够了) 一.基础知识 CAAnimation.png 二.CABasicAnimation 1. 动画的属性和解释 2.属性值的解释 repeatCount : 如果在swift中需要一直不断重复:Float.infinity,OC:HUGE_VALF timingFunction: timingFunction.png kCAMediaTimingFunctionLinear--在整个动画时间内动画都是以一个相同的速度来改变.也就是匀速运动.一个线性的计时函数

Java中的多线程=你只要看这一篇就够了

如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其实只有一半对,因为反应“多角色”的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的“生产者,消费者模型”. 很多人都对其中的一些概念不够明确,如同步.并发等等,让我们先建立一个数据字典,以免产生误会. 多线程:指的是这个程序(一个进程)运

[转]关于深度学习,看这一篇就够了

关于深度学习,看这一篇就够了 原文地址:http://www.dlworld.cn/XueXiSuanFa/13.html [日期:2016-04-26] 来源:36氪  作者: [字体:大 中 小] 编者按:本文作者王川,投资人,中科大少年班校友,现居加州硅谷,个人微信号9935070,36 氪经授权转载自其个人微信公众号 investguru. 一 2016 年一月底,人工智能的研究领域,发生了两件大事. 先是一月二十四号,MIT 的教授,人工智能研究的先驱者,Marvin Minsky 去

中后台产品的表格设计,看这一篇就够了(原型规范下载)

中后台产品的表格设计,看这一篇就够了(原型规范下载) 2018年4月16日luodonggan 中后台产品的表格设计,看这一篇就够了(原型规范下载) 经过了将近一年的后台产品经历,踩了很多坑,试了很多错,也学习到了很多东西,目前也形成了自己的一套规范.本文将其中的部分收获汇总成文,希望能够对大家有所帮助. 后台产品有一个很重要.常见的元素,就是表格.表格承担着详情入口.数据展示的功能,看似简单,其实里面的细节特别多.在以效率为最重要的需求的后台产品中,如何设计一个能够高效率地进行查看和编辑的表格

关于 Docker 镜像的操作,看完这篇就够啦 !(下)

原文:关于 Docker 镜像的操作,看完这篇就够啦 !(下) 紧接着上篇<关于 Docker 镜像的操作,看完这篇就够啦 !(上)>,奉上下篇 !!! 镜像作为 Docker 三大核心概念中最重要的一个关键词,它有很多操作,是您想学习容器技术不得不掌握的.本文将带您一步一步,图文并重,上手操作来学习它. 目录: 一.Docker 删除镜像 1.1 通过标签删除镜像 1.2 通过 ID 删除镜像 1.3 删除镜像的限制 1.4 清理镜像 二.Docker 创建镜像 2.1 基于已有的镜像创建

源码时代前端干货分享| AE如何实现文字消散效果?看这一篇就够了!

源码时代前端干货分享| AE如何实现文字消散效果?看这一篇就够了!首先:1.新建合成IMAge012.新建一个纯色层做背景(如果自带背景可以忽略)02 3.新建文本图层034.打上文字,调整文字大小,让文字在画布中居中04 然后:5.给文字添加一个蒙版05 6.在0秒的位置的蒙版路径打上关键帧067.0秒的时候蒙版路径最大,3秒的时候蒙版路径最小078.继续添加蒙版羽化089.再新建一个合成为置换0910.新建一个纯色的白图层1011.给它添加一个蒙版1112.在蒙版路径上打上关键帧13.0秒的

用markdown写博客,看这一篇就够了,附markdown文件分享

0. 前言 为什么用markdown写博客? 在写博客的过程中,最大的"痛点"在于写作中总是被"格式"之类的困扰,无法专注于内容写作: 在线写博客,会被网络或者编辑器本身所拖累: 本文介绍的markdown写作,可以使你专注于博客内容本身,写好即成稿: 更重要的是,博客内容及相关素材保存在本地,可以几乎不用修改就可以发布在不同的平台,类似java程序的"一次编写,到处运行". 记得上次用markdown写博客,尽管我有markdown使用经验,但

JAVA8之lambda表达式详解,及stream中的lambda使用

原文:http://blog.csdn.net/jinzhencs/article/details/50748202 lambda表达式详解 一.问题 1.什么是lambda表达式? 2.lambda表达式用来干什么的? 3.lambda表达式的优缺点? 4.lambda表达式的使用场景? 5.lambda只是一个语法糖吗? 二.概念 lambda表达式是JAVA8中提供的一种新的特性,它支持Java也能进行简单的"函数式编程". 它是一个匿名函数,Lambda表达式基于数学中的λ演算