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. SQLSERVER中的LOB页面简单研究

    SQLSERVER中的LOB页面简单研究 这篇文章和我另一篇文章是相辅相成的,在看<SQLSERVER2012 列存储索引的简单研究和测试>这篇文章之前希望大家先看一下这篇文章o(∩_∩) ...

  2. SQL Server全文搜索

    SQL Server全文搜索 看这篇文章之前请先看一下下面我摘抄的全文搜索的MSDN资料,基本上MSDN上关于全文搜索的资料的我都copy下来了 并且非常认真地阅读和试验了一次,并且补充了一些SQL语 ...

  3. Oracle EBS 自治事务

    自治事务程序主要是自主性,那就是,独立于主要的事务.之所以独立,或者提交之后会影响其他事务处理,本质在于它本身符合编译指令的规则,也就是说它属于在编译阶段就执行的指令,而不是在运行阶段执行的. 当自治 ...

  4. sqlserver sql优化案例及思路

    始sql: SELECT TOP 100 PERCENT ZZ.CREW_NAME AS 机组, ZZ.CREW_ID, AA.年度时间, CC.当月时间, DD.连续七天时间 AS 最近七天 FRO ...

  5. SELECT查询结果集INSERT到数据表

    简介 将查询语句查询的结果集作为数据插入到数据表中. 一.通过INSERT SELECT语句形式向表中添加数据 例如,创建一张新表AddressList来存储班级学生的通讯录信息,然后这些信息恰好存在 ...

  6. setuid、setgid、sticky的权限简单用法

    如何设置setuid.setgid.sticky的权限: setuid :置于 u 的 x 位,原位置有执行权限,就置为 s,没有了为 S . chmod 4xxx file chmod u+s xx ...

  7. [IDEA_4] IDEA 从 GitHub 上 pull 项目到本地

    0. 说明 通过参考的链接我们已经知道了怎么安装配置 Git  .GitHub ,如何使用 IDEA 将本地项目上传到 GitHub. 现在是学习怎么通过 IDEA 将项目从 GitHub pull ...

  8. October 18th 2017 Week 42nd Wednesday

    Only someone who is well-prepared has the opportunity to improvise. 只有准备充分的人才能够尽兴表演. From the first ...

  9. 9.算法之顺序、二分、hash查找

    一.查找/搜索 - 我们现在把注意力转向计算中经常出现的一些问题,即搜索或查找的问题.搜索是在元素集合中查找特定元素的算法过程.搜索通常对于元素是否存在返回 True 或 False.有时它可能返回元 ...

  10. vue-cli静态资源处理

    vue-cli是利用webpack进行打包部署,其中静态资源的路径问题是一个比较麻烦的部分. 项目中共有两个存放静态文件的地方. /static 根目录下的static文件夹 assets src目录 ...