Java8函数式编程(一):Lambda表达式类型与常用函数接口

[TOC]


1 前言

最近在看一些开源项目的源码,函数式编程风格的代码无处不在,所以得要好好学一下了。

2 Lambda表达式类型

无参数:

Runnable noArguments = () -> System.out.println("Hello World!");
noArguments.run();

一个参数:

UnaryOperator<Boolean> oneArgument = x -> !x;
System.out.println(oneArgument.apply(true));

多行语句:

Runnable multiStatement = () -> {
    System.out.print("Hello");
    System.out.println(" World!");
};

两个参数:

BinaryOperator<Integer> add = (x, y) -> x + y;
add.apply(1, 2);

显式类型:

BinaryOperator<Integer> addExplicit = (Integer x, Integer y) -> x + y;

3 常用函数接口

每个函数接口列举一些例子来说明。

3.1 Predicate<T>

判断一个数是否为偶数。

Predicate<Integer> isEven = x -> x % 2 == 0;

System.out.println(isEven.test(3)); // false

3.2 Consumer<T>

打印字符串。

Consumer<String> printStr = s -> System.out.println("start#" + s + "#end");

printStr.accept("hello");   // start#hello#end
List<String> list = new ArrayList<String>(){{
    add("hello");
    add("world");
}};
list.forEach(printStr);

3.3 Function<T,R>

将数字加1后转换为字符串。

Function<Integer, String> addThenStr = num -> (++num).toString();

String res = addThenStr.apply(3);
System.out.println(res);    // 4

3.4 Supplier<T>

创建一个获取常用SimpleDateFormat的Lambda表达式。

Supplier<SimpleDateFormat> normalDateFormat = () -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

SimpleDateFormat sdf = normalDateFormat.get();
Date date = sdf.parse("2019-03-29 23:24:05");
System.out.println(date);   // Fri Mar 29 23:24:05 CST 2019

3.5 UnaryOperator<T>

实现一元操作符求绝对值。

UnaryOperator<Integer> abs = num -> -num;

System.out.println(abs.apply(-3));  // 3

3.6 BinaryOperator<T>

实现二元操作符相加。

BinaryOperator<Integer> multiply = (x, y) -> x * y;

System.out.println(multiply.apply(3, 4));   // 12

原文地址:https://blog.51cto.com/xpleaf/2371539

时间: 2024-10-09 21:47:31

Java8函数式编程(一):Lambda表达式类型与常用函数接口的相关文章

Java函数式编程和lambda表达式

为什么要使用函数式编程 函数式编程更多时候是一种编程的思维方式,是种方法论.函数式与命令式编程的区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉代码要怎么做.说白了,函数式编程是基于某种语法或调用API去进行编程.例如,我们现在需要从一组数字中,找出最小的那个数字,若使用用命令式编程实现这个需求的话,那么所编写的代码如下: public static void main(String[] args) { int[] nums = new int[]{1, 2, 3, 4, 5,

Java 函数式编程和Lambda表达式

1.Java 8最重要的新特性 Lambda表达式.接口改进(默认方法)和批数据处理. 2.函数式编程 本质上来说,编程关注两个维度:数据和数据上的操作. 面向对象的编程泛型强调让操作围绕数据,这样可以实现以类为单位的重用,当为类添加新的数据类型时,原有代码无需修改. 函数式编程是一种不同的编程模型,它以操作(函数)为中心,强调变量不变性.函数式编程的准则是不依赖外部的数据,也不改变外部数据的值.这一特性满足了多核并行程序设计的需求,因此能简化并行程序开发. 函数式编程用函数来表达所有的概念,完

Java函数式编程(Lambda表达式)小记

函数式编程 函数式编程(Functional Programming)是编程范式的一种.最常见的编程范式是命令式编程(Impera Programming),比如面向过程.面向对象编程都属于命令式编程,大家用得最多.最熟悉.函数式编程并非近几年的新技术或新思维,其诞生已有50多年时间. 在函数式编程里面,一切都是数学函数.当然,函数式编程语言里也可以有对象,但这些对象是不可变的——要么是函数参数要么是返回值.函数式编程语言里没有for等循环,而是通过递归.把函数当成参数传递的方式实现循环效果.

Java8特性详解 lambda表达式 Stream

1.lambda表达式 Java8最值得学习的特性就是Lambda表达式和Stream API,如果有python或者javascript的语言基础,对理解Lambda表达式有很大帮助,因为Java正在将自己变的更高(Sha)级(Gua),更人性化.--------可以这么说lambda表达式其实就是实现SAM接口的语法糖. lambda写的好可以极大的减少代码冗余,同时可读性也好过冗长的内部类,匿名类. 先列举两个常见的简化(简单的代码同样好理解) 创建线程 排序 lambda表达式配合Jav

2020了你还不会Java8新特性?Lambda表达式及API(二)

lambda表达式 为什么要使用lambda表示式 在Java中无法将函数座位参数传递给一个方法,也无法返回一个函数的方法. 在js中,函数的参数是一个函数.返回值是另一个函数的情况是非常常见的.是一门经典的函数式语言. Java匿名内部类. 匿名内部类的介绍 Gradle的使用.可以完全使用maven的中央仓库. 进行安卓的开发时,gradle已经成为标配了. lambda: 匿名内部类 my_jButton.addActionListener(new ActionListener() { @

Java8新特性03 Lambda表达式

一. Lambda表达式概述 Lambda表达式是Java8中最大的变化.它允许我们将一个函数当作方法的参数,或者说把一段代码当作数据使用.很多基于JVM平台的语言一开始就支持Lambda表达式,比如Scala,但是Java语言一直只能使用匿名内部类来替代Lambda表达式,直到Java8才使用Lambda表达式. 二.定义 Lambda表达式是一个匿名函数,它是一个函数式接口的具体实现方式:使用Lambda语法可以用来代替Java8之前的匿名内部类,从而简化代码. 任意只包含一个抽象方法的接口

好程序员分享java8新特性之Lambda表达式

?.Lambda表达式简介 什么是Lambda? Lambda表达式是Java 8推出的?个新特性.从本质上讲,Lambda表达式是?个匿名函数. 为什么要使?Lambda? 使?Lambda表达式可以对?个接?进??常简洁的实现. 之前我们在给?个接?引?赋值的时候,可以使?接?实现类,或者匿名内部类.但是有了 Lambda表达式,我们可以更加?便的实现这个需求. interface Comparator<T>?{ int compare(T o1, T o2); } class Progr

匿名方法,Lambda表达式,高阶函数

原文:匿名方法,Lambda表达式,高阶函数 匿名方法 c#2.0引入匿名方法,不必创建单独的方法,因此减少了所需的编码系统开销. 常用于将委托和匿名方法关联,例如 1. 使用委托和方法关联: this.btnRefresh.Click += new System.EventHandler(this.btnRefresh_Click);private void btnRefresh_Click(object sender, EventArgs e){    BindData();} 2. 使用委

Lambda表达式相当于一个函数

看来你对Lambda完全不懂.Lambda表达式相当于一个函数. 比如model => model.Name相当于string 一个函数(Model的类型 model) {     return model.Name; }看到了么?model是形参,这个名字无所谓的.你写string 一个函数(Model的类型 x) {     return x.Name; }这两个函数是不是完全等价的? 因此model => model.Name和x => x.Name也是等价的.