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学习---方法引用和其他基本应用的更多相关文章

  1. 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

    作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...

  2. [转]深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

    以下内容转自: 作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-l ...

  3. 函数式接口 & lambda表达式 & 方法引用

    拉呱: 终于,学习jdk8的新特性了,初体验带给我的感觉真爽,代码精简的不行,可读性也很好,而且,spring5也是把jdk8的融入到血液里,总之一句话吧,说的打趣一点,学的时候自己难受,学完了写出来 ...

  4. Java8特性之Lambda、方法引用以及Stream流

    Java 8 中的 Streams API 详解:https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/ Java笔记——Jav ...

  5. lambda与方法引用

    哈喽,大家好,我是指北君. 虽然目前Java最新版本都已经到16了,但是绝大部分公司目前用的Java版本都是8,想当初Java8问世后,其Lambda表达式与方法引用可是最亮眼的新特性,目前,这两个特 ...

  6. Java笔记——Java8特性之Lambda、方法引用和Streams

    Java8已经推出了好一段时间了,而掌握Java8的新特性也是必要的,如果要进行Spring开发,那么可以发现Spring的官网已经全部使用Java8来编写示例代码了,所以,不学就看不懂. 这里涉及三 ...

  7. Java8特性之Lambda、方法引用和Streams

    这里涉及三个重要特性: Lambda 方法引用 Streams ① Lambda 最早了解Lambda是在C#中,而从Java8开始,Lambda也成为了新的特性,而这个新的特性的目的,就是为了消除单 ...

  8. java8之lambda表达式&方法引用(一)

    本文将简单的介绍一下Lambda表达式和方法引用,这也是Java8的重要更新,Lambda表达式和方法引用最主要的功能是为流(专门负责迭代数据的集合)服务. 什么是lambda表达式 可以把lambd ...

  9. 黑马Lambda表达式学习 Stream流 函数式接口 Lambda表达式 方法引用

随机推荐

  1. 使用MyEclipse建立working set

    1.用eclipse或者MyEclipse开发久了后,会有很多的项目,就算关闭了还会有很多,这是需要建立一个working set,相当在工作区中建立项目文件夹分类放自己做过的一些项目. 如下图:   ...

  2. [Linux|DBA]运维三十六计

    这里是腾讯两位大神梁定安.周小军总记得运维DBA三十六计--

  3. Relinking Oracle Home FAQ ( Frequently Asked Questions) (Doc ID 1467060.1)

    In this Document   Purpose   Questions and Answers   1)  What is relinking ?   2)  What is relinking ...

  4. UNIX高级环境编程(10)进程控制(Process Control)- 竞态条件,exec函数,解释器文件和system函数

    本篇主要介绍一下几个内容: 竞态条件(race condition) exec系函数 解释器文件    1 竞态条件(Race Condition) 竞态条件:当多个进程共同操作一个数据,并且结果依赖 ...

  5. October 31st, 2017 Week 44th Tuesday

    No matter how hard the past is, you can always begin again. 不管过去有多么困难,你都可以重新开始. Honestly, I don't ag ...

  6. jQuery做字符串分隔

    var str=new String(); var arr=new Array(); str="ddd,dsd,3,dd,g,k"; //可以用字符或字符串分割 arr=str.s ...

  7. Sqoop学习之路 (一)

    一.概述 sqoop 是 apache 旗下一款“Hadoop 和关系数据库服务器之间传送数据”的工具. 核心的功能有两个: 导入.迁入 导出.迁出 导入数据:MySQL,Oracle 导入数据到 H ...

  8. 列表操作方法,元祖,for循环嵌套

    li = ['alex','wusir''女神']增 1.增加到列表末位 li.append() 连续增加,输入q停止 li = ['alex','wusir''女神'] while 1: s = i ...

  9. RMAN常用命令汇总!

    进入RMAN:$ rman target sys/oracle@orcl   --远程连接到rman$ rman target sys/oracle@orcl @backup_db.ram   --远 ...

  10. JS模拟滚动条(有demo和源码下载,支持拖动 滚轮 点击事件)

    由于游览器自带的滚动条在美观方面并不是很好看,所以很多设计师希望通过自己设计出来的滚动条来做这样的效果,JS模拟滚动条其实很早看到jQuery有这样的插件或者KISSY有这样的组件,一直想着自己什么时 ...