关键词:
前言
本系列文章为在《告别996,开启Java高效编程之门》学习过程中的学习笔记和课外资料补充,希望可以方便自己和其他需要的同学查阅。
Lambda表达式简介
①Java8引入的函数式编程风格;
②可以理解为一种匿名函数的代替;
③通过行为参数传递代码。
Lambda表达式的形式
(parameters) -> expression
(parameters) -> statement;
形式一:没有参数
() -> System.out.println("Hello World!");
形式二:只有一个参数
name -> System.out.println("Hello World from " + name + " !");
形式三:没有参数,逻辑复杂
() ->
System.out.println("Hello");
System.out.println("World!");
形式四:包含两个参数的方法
BinaryOperator<Long> functionAdd = (x,y) -> x + y;
Long result = functionAdd.apply(1L, 2L);
形式五:对参数显式声明
BinaryOperator<Long> functionAdd = (Long x, Long y) -> x + y;
Long result = functionAdd.apply(1L, 2L);
函数式接口
①接口中只有一个抽象方法;
②Java8的函数式接口注解: @FunctionInterface ;
③函数式接口的抽象方法签名:函数描述符。
实战案例:自定义函数式接口
自定义函数式接口,实现读取本地文件后自定义处理逻辑功能。
1.定义函数式接口
/**
* 文件处理函数式接口
*/
@FunctionalInterface
public interface FileConsumer
/**
* 函数式接口抽象方法
* @param fileContent - 文件内容字符串
*/
void fileHandler(String fileContent);
2.通过url获取本地文件内容,调用函数式接口进行处理
package com.pino.lambda.file;
import java.io.*;
public class FileService
/**
* 通过url获取本地文件内容,调用函数式接口进行处理
* @param url
* @param fileConsumer
* @throws IOException
*/
public void fileHandle(String url, FileConsumer fileConsumer) throws IOException
//创建文件读取流
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(
new FileInputStream(url)));
//定义行变量和内容sb
String line;
StringBuilder sb = new StringBuilder();
//循环读取文件内容
while ((line = bufferedReader.readLine()) != null)
sb.append(line + "\\n");
//调用函数式接口方法,将文件内容传递给lambda表达式,实现业务逻辑
fileConsumer.fileHandler(sb.toString());
3.测试用例
package com.pino.lambda.file;
import org.junit.Test;
import java.io.IOException;
import static org.junit.Assert.*;
public class FileServiceTest
@Test
public void fileHandle() throws IOException
FileService fileService = new FileService();
fileService.fileHandle("E:\\\\learn\\\\996\\\\src\\\\test\\\\com\\\\pino\\\\lambda\\\\file\\\\FileServiceTest.java", fileContent ->
System.out.println(fileContent);
);
4.测试结果
常用函数接口及使用
接口 | 参数 | 返回类型 | 描述 |
Predicate<T> | T | boolean | 用于判别一个对象。比如判断一个人是否为男性。 |
Consumer<T> | T | void | 用于接收一个对象进行处理但没有返回,比如接收一个人并打印他的名字。 |
Function<T, R> | T | R | 转换一个对象为另一个不同类型的对象。 |
Supplier<T> | None | T | 提供一个对象。 |
UnaryOperator<T> | T | T | 接收对象并返回同类型的对象。 |
BinaryOperator<T> | (T, T) | T | 接收两个同类型的对象,并返回一个原类型对象。 |
方法引用
方法引用是调用特定方法的Lambda表达式的一种快捷写法,可以让你重复使用现有的方法定义,并像Lambda表达式一样传递它们。
格式如下:
Optional.ofNullable(cartSkuList)
.map(List::stream)
.orElseGet(Stream::empty)
.sorted(Comparator.comparing(Sku::getTotalNum))
.forEach(resultSkuList::add);
①指向静态方法的方法引用:
/**
* (args) -> ClassName.staticMethod(args);
* ClassName::staticMethod
*/
public void test1()
Consumer<String> consumer1 = (String number) -> Integer.parseInt(number);
Consumer<String> consumer2 = Integer::parseInt;
②指向任意类型实例方法的方法引用:
/**
* (args) -> args.instanceMethod();
* ClassName::instanceMethod
*/
public void test2()
Consumer<String> consumer1 = (String str) -> str.length();
Consumer<String> consumer2 = String::length;
③指向现有对象的实例方法的方法引用:
/**
* (args) -> object.instanceMethod(args);
* object::instanceMethod
*/
public void test3()
StringBuilder sb = new StringBuilder();
Consumer<String> consumer1 = (String str) -> sb.append(str);
Consumer<String> consumer2 = sb::append;
参考链接:https://blog.csdn.net/icarusliu/article/details/79495534
java之函数编程(代码片段)
...他需要的同学查阅。Lambda表达式简介 ①Java8引入的函数式编程风格; ②可以理解为一种匿名函数的代替; ③通过行为参数传递代码。Lambda表达式的形式 (parameters)->expression (parameter... 查看详情
java并发编程之美之并发编程线程基础(代码片段)
...线程,进程的多个线程共享进程的资源。 java启动main函数其实就是启动了一个JVM的进程,而main函数所在的线程就是这个进程的一个线程,也称主线程。进程和线程关系 一个进程有多个线程,多个线程共享进程的堆和... 查看详情
java高阶进阶之java函数式编程-stream流-lambda表达式(代码片段)
...dk1.8中新增了流Stream,和Lambda表达式Stream流、Lambda表达式是函数式编程思想,可以让我们不用关注什么对象,而是关注对数据进行了什么操作,Stream可以很方便对我们的集合数组进行操作。并且在大数据下处理效果高... 查看详情
java高阶进阶之java函数式编程-stream流-lambda表达式(代码片段)
...dk1.8中新增了流Stream,和Lambda表达式Stream流、Lambda表达式是函数式编程思想,可以让我们不用关注什么对象,而是关注对数据进行了什么操作,Stream可以很方便对我们的集合数组进行操作。并且在大数据下处理效果高... 查看详情
java8新特性之lambda(代码片段)
...递到各处。一段时间以来,Java因为自身的冗长和缺少函数式编程的能力而受到批评。随着函数式编程变得越来越流行和有价值,Java也在努力接受函数式编程。否 查看详情
java8新特性之lambda(代码片段)
...递到各处。一段时间以来,Java因为自身的冗长和缺少函数式编程的能力而受到批评。随着函数式编程变得越来越流行和有价值,Java也在努力接受函数式编程。否则,Java将会变得没有价值。Java8在使世界上最受欢迎的... 查看详情
网络编程之select(代码片段)
一select函数简介 select一般用在socket网络编程中,在网络编程的过程中,经常会遇到许多阻塞的函数,网络编程时使用的recv,recvfrom、connect函数都是阻塞的函数,当函数不能成功执行的时候,程序就会一直阻塞在这里,无法执... 查看详情
rxjs入门之函数响应式编程(代码片段)
一.函数式编程1.声明式(Declarativ)和声明式相对应的编程?式叫做命令式编程(ImperativeProgramming),命令式编程也是最常见的?种编程?式。//命令式编程:functiondouble(arr)constresults=[]for(leti=0;i<arr.length;i++)results.push(arr[i]*2)returnresult... 查看详情
shell之函数(代码片段)
前言 Shell函数的本质是一段可以重复使用的脚本代码,这段代码被提前编写好了,放在了指定的位置,使用时直接调取即可。Shell中的函数和C++、Java、Python、C#等其它编程语言中的函数类似,只是在语法细节有所差别。 ... 查看详情
运维linuxshell编程之函数使用(代码片段)
前言使用linux的shell编程,可以说函数是非常重要的内容,也是在编写各类shell脚本的时候经常用到的,本篇将介绍下函数相关的使用。shell函数分类系统函数自定义函数系统函数系统函数为linux自带的函数,可以在shell... 查看详情
cmd运行java文件不显示——stream代码简洁之道的详细用法(代码片段)
...处理数据的方式。Java8中之所以费这么大的功夫引入 函数式编程 ,原因有两个:代码简洁函数式编程写出的代码简洁且意图明确,使用stream接口让你从此告别for循环。多核友好,Java函数式编程使得编写并行程序从未如此... 查看详情
函数式编程之-f#类型系统(代码片段)
在深入到函数式编程思想之前,了解函数式独有的类型是非常有必要的。函数式类型跟OO语言中的数据结构截然不同,这也导致使用函数式编程语言来解决问题的思路跟OO的思路有明显的区别。什么是类型?类型在编程语言中有... 查看详情
socket编程之使用fsockopen()函数(代码片段)
fsockopen函数:初始化一个套接字连接到指定主机(hostname)get方式:client.php1<?php2//创建连接3$fp=fsockopen(‘localhost‘,80,$error,$errstr,10);45//检测6if(!$fp)7echo$errstr;die;8910//拼接http请求报文11$http=‘‘;1213//请求报文包括3部分请求行请... 查看详情
java之socket编程(nio多路复用器)(代码片段)
...ctionKey.channel()获取一个channel。selector.select()是一个阻塞型函数,得有事件触发他的执行,他执行之后,可以通过 selector.selec 查看详情
函数式编程之-重新认识泛型(代码片段)
...把泛型也叫做类型提升(lifting),这样带来的问题是以往的函数不能再适应提升类型,试想之前已经存在一个a->b的函数,但是此时你拥有一个E<a>变量,你无法直接把E<a>传入到a->b的函数中。上一节还提到,一旦你的... 查看详情
es6异步编程解决方案之async(代码片段)
一、async函数的基本用法async函数返回一个Promise对象,可以使用then、catch方法添加回调函数async函数执行时,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句【异步函数同步执行】async函数有很多种... 查看详情
020-并发编程-java.util.concurrent之-jdk6/7/8中concurrenthashmaphashmap分析(代码片段)
...表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 给定表M,存在函数f(key) 查看详情
[读书笔记]java编程思想第4章之控制执行流程(代码片段)
...分逗号操作符和逗号分隔符:用作分隔符时用来分隔函数的不同参数;Java里唯一用到逗号操作符的地方就是for循环的控制表达式,可以在for语句内定义多个变量,但是它们必须具有相同的类型。Java编译器生成它... 查看详情