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. 在 Azure Resource Manager 中为虚拟机设置密钥保管库

    Note Azure 具有两种不同的部署模型,用于创建和处理资源:Resource Manager 模型和经典模型.本文介绍使用 Resource Manager 部署模型.Azure 建议对大多数新 ...

  2. ngrep命令用法

    ngrep 是grep(在文本中搜索字符串的工具)的网络版,他力求更多的grep特征,用于搜寻指定的数据包.正由于安装ngrep需用到libpcap库, 所以支持大量的操作系统和网络协议.能识别TCP ...

  3. 学习笔记:Rick's RoTs -- Rules of Thumb for MySQL

    Table of Contents SELECTs -- do's and don'tsINDEXingENGINE DifferencesOptimizations, and notPARTITIO ...

  4. .NET Core 环境下使用命令行移除某个 nuget 包的具体方法

    .NET Core 使用Nuget包一般是先写入csproj文件,然后下载保存在\bin\Debug\netcoreapp2.0\publish\下,所以可以采用如下方案进行删除操作(其中netcor ...

  5. MySQL基础之 视图

    视图 视图就是从一个表或多个表导出来的一张虚拟的表.通过这个窗口可以看到系统专门提供的数据,方便用户操作的同时增加了安全性. 视图的特点: 1.视图的列可以来自于不同的表. 2.视图是由实际存在的表创 ...

  6. SQL server权限管理和备份实例

    权限设置: 1.创建用户zhangsan,并赋予zhangsan有dbcreator的服务器权限. 2.使用zhangsan登录,测试能否创建数据库. 3.使用sa用户附加myschool数据库,设置 ...

  7. C++中const和指针

    常见的理解问题: const char * * s;//表示s是指向const char * 类型的指针: char * * const s;//表示s是指向char * 类型的一个常量指针.

  8. Linux基础第二课——系统架构

    网址 192.168.0. 172.16. 10.0. 以上是内网网段 127.0.0.1 这是本地回环网卡 表示本身 查看网络是否连通 windows Linux 都是通过 ping 先ping网关 ...

  9. swift语言的特征:类型系统与函数式编程:swift是面向类型和面向函数编程的语言

    swift语言的特征: 类型系统:值类型与引用类型.泛型.协议类型 函数式编程:

  10. Volley源码分析(二)CacheDispatcher分析

    CacheDispatcher 缓存分发 cacheQueue只是一个优先队列,我们在start方法中,分析了CacheDispatcher的构成是需要cacheQueue,然后调用CacheDisp ...