Lambda学习---方法引用和其他基本应用
package com.zx; import java.util.*;
import java.util.function.*;
import java.util.stream.Collectors;
import java.util.stream.Stream; /**
* lambdaTest类
*
* @author ning
* @create 2018-06-11 17:19
**/
public class LambdaTest { public static void main(String[] args){ new Thread(() -> {System.out.println("lambda创建一个新线程");}).start(); List<String> listStr = Arrays.asList("Java","C","C++","C#","Python","PHP");
StringBuilder sb = new StringBuilder();
listStr.forEach(n -> System.out.println(sb.append(",").append(n))); /**
* 用特殊符号拼接
* */
String collect = listStr.stream().collect(Collectors.joining(","));
System.out.println(collect);
String collect1 = listStr.stream().collect(Collectors.joining("#"));
System.out.println(collect1); listStr.sort((a,b) -> a.compareTo(b));
System.out.println(listStr); String abc = "hello";
Consumer<String> consumer = (a) -> {}; Function<String,String> function = x -> x.toUpperCase();
String zsdf = function.apply("zsdf");
System.out.println(zsdf); /**
* 静态方法引用
* 语法格式- - 类目::staticMethod
*/
//只有一个输出
Supplier<String> supplier = LambdaTest::put;
System.out.println(supplier.get());
//只有一个输入
Consumer<String> c1 = LambdaTest::consume;
c1.accept("张三");
//一个输入,一个输出
Function<String, String> f1 = LambdaTest::convertUp;
System.out.println(f1.apply("a"));
//两个输入,一个输出
BiFunction<String,String,Integer> biFunction = LambdaTest::getLength;
System.out.println(biFunction.apply("abc","123"));
////////////////////// 方法的引用 - start ////////////////////////
/**
* 实例方法引用
* 语法格式- - 实例::实例Method
*/
Supplier<String> s1 = new LambdaTest()::put1;
System.out.println(s1.get());
LambdaTest lt = new LambdaTest();
Consumer<String> c2 = lt::consume1;
c2.accept("王五"); /**
* 对象方法引用
* 定义:抽象方法的第一个参数类型【最好是自定义的类型】刚好是实例方法的类型【言外之意,必需有参数】,抽象方法剩余的参数恰好可以当作实例方法的参数。
* 如果函数式接口的实现能用上面说的实例方法调用来实现的话,那么就可以使用对象方法引用
* 语法格式- - 类名::实例Method
*/
Consumer<Too> c3 = (Too too) -> new Too().too();
c3.accept(new Too());
Consumer<Too> c4 = Too::too;
c4.accept(new Too());
BiConsumer<Too,String> c5 = (too, ac) -> new Too().too1(ac);
c5.accept(new Too(),"宁大人");
//两个输入,一个输出
BiFunction<Too, String, Integer> biFunction1 = (p,s) -> new Too().too2(s);
BiFunction<Too, String, Integer> biFunction2 = Too::too2;
System.out.println(biFunction1.apply(new Too(),"123"));
System.out.println(biFunction2.apply(new Too(),"123"));
/**
* 构造方法的引用
* 定义:如果函数式接口的实现恰好可以通过调用一个类的构造方法来实现,那么就可以使用构造方法引用
* 语法格式- - 类名::new
*/
Supplier<Person> s2 = () -> new Person();
s2.get();
Supplier<Person> s3 = Person::new;
s3.get();
//含有无参构造函数都可以使用Supplier,如下:
Supplier<List> s4 = ArrayList::new;
Supplier<Thread> s5 = Thread::new;
Supplier<Set> s6 = HashSet::new;
Supplier<String> s7 = String::new; //含有有参构造函数的
Consumer<Integer> c6 = Account::new;
c6.accept(123); Function<String, Integer> f2 = Integer::new;
System.out.println(f2.apply("456")); ////////////////////// 方法的引用 - end //////////////////////// ////////////////////// Stream API - start //////////////////////// /***
* stream的创建
* */
//1、数组
String[] arr = {"1","b","c"};
Integer[] arr1 = {1,2,3,4};
Stream<String> stream1 = Stream.of(arr);
Stream<Integer> stream2 = Stream.of(arr1);
//2、集合
List<String> list1 = Arrays.asList("1","2","3");
Stream<String> stream = list1.stream(); /**
* 中间操作
* */
Arrays.asList(1, 2, 3, 4, 5, 6).stream().filter(x -> x % 2 == 0).forEach(System.out::println);
int max = Arrays.asList(1, 2, 3, 4, 5, 6).stream().max((a1,b1) -> a1-b1).get();
System.out.println(max);
Integer min = Arrays.asList(1, 2, 3, 4, 5, 6).stream().min((a1, b1) -> a1 - b1).get();
System.out.println(min);
//求集合元素数量
long count = Arrays.asList(1, 2, 3, 4, 5).stream().count();
System.out.println(count);
//截取
Arrays.asList(1, 2, 3, 4, 5, 6).stream().limit(3).forEach(System.out::println);
//求平均值
double asDouble = Arrays.asList(1, 2, 3, 4, 5, 6).stream().mapToInt(x -> x).average().getAsDouble();
System.out.println(asDouble);
//查找任意匹配的元素
Optional<Integer> first = Arrays.asList(1, 2, 3, 4, 5, 6).stream().filter(x -> x % 2 == 0).findAny();
System.out.println(first.get());
//查找第一个匹配的元素
Optional<Integer> first1 = Arrays.asList(1, 2, 3, 4, 5, 6).stream().filter(x -> x % 2 == 0).sorted((a,b) -> b -a).findFirst();
System.out.println(first1.get());
//从1-50里面的所有偶数找出来,放到一个list中
List<Integer> list2 = Stream.iterate(1, x -> x + 1).limit(50).filter(n -> n % 2 == 0).collect(Collectors.toList());
list2.forEach(System.out::println);
//集合元素去重
Arrays.asList(1,2,3,4,5,4,3,5,6,7,3,8).stream().distinct().forEach(System.out::println);
//将流转成set集合
Set<Integer> collect2 = Arrays.asList(1, 2, 3, 4, 5, 4, 3, 5, 6, 7, 3, 8).stream().collect(Collectors.toSet());
System.out.println(collect2);
//从1-50里面的所有偶数找出来,忽略前10个,放到一个list中
List<Integer> list3 = Stream.iterate(1, x -> x + 1).limit(50).filter(n -> n % 2 == 0).skip(10).collect(Collectors.toList());
System.out.println(list3);
//类似分页效果, skip(10).limit(10) :跳过前10条,相当于查询第二页,每页10条
List<Integer> list4 = Stream.iterate(1, x -> x + 1).limit(50).sorted((a,b) -> b -a).skip(10).limit(10).collect(Collectors.toList());
System.out.println(list4);
////////////////////// Stream API - end ////////////////////////
} String put1(){
return "world";
} static String put(){
return "hello";
} void consume1(String string){
System.out.println(string + ", 哈哈哈");
}
static void consume(String string){
System.out.println(string + ", 哈哈哈");
}
static String convertUp(String a){
return a.toUpperCase();
}
static Integer getLength(String a, String b){
return a.length() + b.length();
}
} class Account{
public Account(int age){
System.out.println(age);
}
} class Person{
public Person(){
System.out.println("person 构造方法调用了");
}
} class Too{
public void too(){
System.out.println("invoke.............");
} public void too1(String str){
System.out.println(str + ",invoke.............");
} public Integer too2(String p) {
return 1;
}
}
Lambda学习---方法引用和其他基本应用的更多相关文章
- 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...
- [转]深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
以下内容转自: 作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-l ...
- 函数式接口 & lambda表达式 & 方法引用
拉呱: 终于,学习jdk8的新特性了,初体验带给我的感觉真爽,代码精简的不行,可读性也很好,而且,spring5也是把jdk8的融入到血液里,总之一句话吧,说的打趣一点,学的时候自己难受,学完了写出来 ...
- Java8特性之Lambda、方法引用以及Stream流
Java 8 中的 Streams API 详解:https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/ Java笔记——Jav ...
- lambda与方法引用
哈喽,大家好,我是指北君. 虽然目前Java最新版本都已经到16了,但是绝大部分公司目前用的Java版本都是8,想当初Java8问世后,其Lambda表达式与方法引用可是最亮眼的新特性,目前,这两个特 ...
- Java笔记——Java8特性之Lambda、方法引用和Streams
Java8已经推出了好一段时间了,而掌握Java8的新特性也是必要的,如果要进行Spring开发,那么可以发现Spring的官网已经全部使用Java8来编写示例代码了,所以,不学就看不懂. 这里涉及三 ...
- Java8特性之Lambda、方法引用和Streams
这里涉及三个重要特性: Lambda 方法引用 Streams ① Lambda 最早了解Lambda是在C#中,而从Java8开始,Lambda也成为了新的特性,而这个新的特性的目的,就是为了消除单 ...
- java8之lambda表达式&方法引用(一)
本文将简单的介绍一下Lambda表达式和方法引用,这也是Java8的重要更新,Lambda表达式和方法引用最主要的功能是为流(专门负责迭代数据的集合)服务. 什么是lambda表达式 可以把lambd ...
- 黑马Lambda表达式学习 Stream流 函数式接口 Lambda表达式 方法引用
随机推荐
- 文档撰写思路与排版(hadoop)
这几天在写项目提交的几个报告,写完回想了一下,在写作框架确定与排版上浪费了不少时间,特此总结一下思路. 这个写完回家过年了....emmmm 1. 定好大标题框架,使用自动添加序号,先不着急修改样式 ...
- Oracle EBS OM 取消订单
DECLARE l_header_rec OE_ORDER_PUB.Header_Rec_Type; l_line_tbl OE_ORDER_PUB.Line_Tbl_Type; l_action_r ...
- SQL Server 合并复制的Article可以指定单个对象的更新方向
如下所示,这是SQL Server中一个合并复制发布端的Article: 我们可以在Article中选择一个对象,比如这里我们选择MD.Car表,点击鼠标右键,选择"Set Properti ...
- 关于<asp:checkBoxList>控件的对齐方法
定义和用法 TextAlign 属性用于获取或设置 CheckBoxList 项目的文本的文本对齐方式. 语法 <asp:CheckBoxList TextAlign="align&q ...
- sed 指定行范围匹配(转)
sed -n '5,10{/pattern/p}' file sed是一个非交互性性文本编辑器,它编辑文件或标准输入 导出的文件拷贝.标准输入可能是来自键盘.文件重定向.字符串或变量,或者是一个管道文 ...
- 使用mpVue开发小程序实战总结
1.图形验证码接口返回base64格式的数据,使用image标签接收不显示问题. 解决方法: 使用wx.base64ToArrayBuffer和wx.arrayBufferToBase64转化一遍数据 ...
- [JSOI2009]球队收益
题目 这题好神啊 我们发现一个球队的总比赛场数是确定的,设第\(i\)支球队一共进行了\(s_i\)场比赛 于是这个球队的收益就是\(c_i\times x^2+d_i(s_i-x)^2\) 我们拆开 ...
- [USACO2004OPEN]Cave Cows 3
嘟嘟嘟 看完题后突然想起jf巨佬的话:"看到曼哈顿距离就想转切比雪夫距离." 于是我就转换了一下. 然后问题变成了求 \[max_{i, j \in n} \{ max \{ |x ...
- php输出日志
error_log('你要输出的信息', 3, 'E:\work\jiajiayue\Application\Api\Controller\1.txt');die; php error_log记录日志 ...
- 11.C++和C的区别,什么是面向对象
c++封装更好,调用接口,c调用子函数 1.首先C和C++在基础语句上没有太大区别,c++在c基础上改进,兼容大部分c的语法结构.c++面向对象,c面向过程. 2.新增new和delete的语法,引用 ...