zoukankan      html  css  js  c++  java
  • Lambda学习---方法引用和其他基本应用

      1 package com.zx;
      2 
      3 import java.util.*;
      4 import java.util.function.*;
      5 import java.util.stream.Collectors;
      6 import java.util.stream.Stream;
      7 
      8 /**
      9  * lambdaTest类
     10  *
     11  * @author ning
     12  * @create 2018-06-11 17:19
     13  **/
     14 public class LambdaTest {
     15 
     16     public static void main(String[] args){
     17 
     18         new Thread(() -> {System.out.println("lambda创建一个新线程");}).start();
     19 
     20         List<String> listStr = Arrays.asList("Java","C","C++","C#","Python","PHP");
     21         StringBuilder sb = new StringBuilder();
     22         listStr.forEach(n -> System.out.println(sb.append(",").append(n)));
     23 
     24         /**
     25          * 用特殊符号拼接
     26          * */
     27         String collect = listStr.stream().collect(Collectors.joining(","));
     28         System.out.println(collect);
     29         String collect1 = listStr.stream().collect(Collectors.joining("#"));
     30         System.out.println(collect1);
     31 
     32         listStr.sort((a,b) -> a.compareTo(b));
     33         System.out.println(listStr);
     34 
     35         String abc = "hello";
     36         Consumer<String> consumer = (a) -> {};
     37 
     38         Function<String,String> function = x -> x.toUpperCase();
     39         String zsdf = function.apply("zsdf");
     40         System.out.println(zsdf);
     41 
     42         /**
     43          * 静态方法引用
     44          * 语法格式- - 类目::staticMethod
     45          */
     46         //只有一个输出
     47         Supplier<String> supplier = LambdaTest::put;
     48         System.out.println(supplier.get());
     49         //只有一个输入
     50         Consumer<String> c1 = LambdaTest::consume;
     51         c1.accept("张三");
     52         //一个输入,一个输出
     53         Function<String, String> f1 = LambdaTest::convertUp;
     54         System.out.println(f1.apply("a"));
     55         //两个输入,一个输出
     56         BiFunction<String,String,Integer> biFunction = LambdaTest::getLength;
     57         System.out.println(biFunction.apply("abc","123"));
     58         //////////////////////  方法的引用 - start  ////////////////////////
     59         /**
     60          * 实例方法引用
     61          * 语法格式- - 实例::实例Method
     62          */
     63         Supplier<String> s1 = new LambdaTest()::put1;
     64         System.out.println(s1.get());
     65         LambdaTest lt = new LambdaTest();
     66         Consumer<String> c2 = lt::consume1;
     67         c2.accept("王五");
     68 
     69         /**
     70          * 对象方法引用
     71          * 定义:抽象方法的第一个参数类型【最好是自定义的类型】刚好是实例方法的类型【言外之意,必需有参数】,抽象方法剩余的参数恰好可以当作实例方法的参数。
     72          * 如果函数式接口的实现能用上面说的实例方法调用来实现的话,那么就可以使用对象方法引用
     73          * 语法格式- - 类名::实例Method
     74          */
     75         Consumer<Too> c3 = (Too too) -> new Too().too();
     76         c3.accept(new Too());
     77         Consumer<Too> c4 = Too::too;
     78         c4.accept(new Too());
     79         BiConsumer<Too,String> c5 = (too, ac) -> new Too().too1(ac);
     80         c5.accept(new Too(),"宁大人");
     81         //两个输入,一个输出
     82         BiFunction<Too, String, Integer> biFunction1 = (p,s) -> new Too().too2(s);
     83         BiFunction<Too, String, Integer> biFunction2 = Too::too2;
     84         System.out.println(biFunction1.apply(new Too(),"123"));
     85         System.out.println(biFunction2.apply(new Too(),"123"));
     86         /**
     87          * 构造方法的引用
     88          * 定义:如果函数式接口的实现恰好可以通过调用一个类的构造方法来实现,那么就可以使用构造方法引用
     89          * 语法格式- - 类名::new
     90          */
     91         Supplier<Person> s2 = () -> new Person();
     92         s2.get();
     93         Supplier<Person> s3 = Person::new;
     94         s3.get();
     95         //含有无参构造函数都可以使用Supplier,如下:
     96         Supplier<List> s4 = ArrayList::new;
     97         Supplier<Thread> s5 = Thread::new;
     98         Supplier<Set> s6 = HashSet::new;
     99         Supplier<String> s7 = String::new;
    100 
    101         //含有有参构造函数的
    102         Consumer<Integer> c6 = Account::new;
    103         c6.accept(123);
    104 
    105         Function<String, Integer> f2 = Integer::new;
    106         System.out.println(f2.apply("456"));
    107 
    108         //////////////////////  方法的引用 - end  ////////////////////////
    109 
    110         //////////////////////  Stream API - start  ////////////////////////
    111 
    112         /***
    113          * stream的创建
    114          * */
    115         //1、数组
    116         String[] arr = {"1","b","c"};
    117         Integer[] arr1 = {1,2,3,4};
    118         Stream<String> stream1 = Stream.of(arr);
    119         Stream<Integer> stream2 = Stream.of(arr1);
    120         //2、集合
    121         List<String> list1 = Arrays.asList("1","2","3");
    122         Stream<String> stream = list1.stream();
    123 
    124         /**
    125          * 中间操作
    126          * */
    127         Arrays.asList(1, 2, 3, 4, 5, 6).stream().filter(x -> x % 2 == 0).forEach(System.out::println);
    128         int max = Arrays.asList(1, 2, 3, 4, 5, 6).stream().max((a1,b1) -> a1-b1).get();
    129         System.out.println(max);
    130         Integer min = Arrays.asList(1, 2, 3, 4, 5, 6).stream().min((a1, b1) -> a1 - b1).get();
    131         System.out.println(min);
    132         //求集合元素数量
    133         long count = Arrays.asList(1, 2, 3, 4, 5).stream().count();
    134         System.out.println(count);
    135         //截取
    136         Arrays.asList(1, 2, 3, 4, 5, 6).stream().limit(3).forEach(System.out::println);
    137         //求平均值
    138         double asDouble = Arrays.asList(1, 2, 3, 4, 5, 6).stream().mapToInt(x -> x).average().getAsDouble();
    139         System.out.println(asDouble);
    140         //查找任意匹配的元素
    141         Optional<Integer> first = Arrays.asList(1, 2, 3, 4, 5, 6).stream().filter(x -> x % 2 == 0).findAny();
    142         System.out.println(first.get());
    143         //查找第一个匹配的元素
    144         Optional<Integer> first1 = Arrays.asList(1, 2, 3, 4, 5, 6).stream().filter(x -> x % 2 == 0).sorted((a,b) -> b -a).findFirst();
    145         System.out.println(first1.get());
    146         //从1-50里面的所有偶数找出来,放到一个list中
    147         List<Integer> list2 = Stream.iterate(1, x -> x + 1).limit(50).filter(n -> n % 2 == 0).collect(Collectors.toList());
    148         list2.forEach(System.out::println);
    149         //集合元素去重
    150         Arrays.asList(1,2,3,4,5,4,3,5,6,7,3,8).stream().distinct().forEach(System.out::println);
    151         //将流转成set集合
    152         Set<Integer> collect2 = Arrays.asList(1, 2, 3, 4, 5, 4, 3, 5, 6, 7, 3, 8).stream().collect(Collectors.toSet());
    153         System.out.println(collect2);
    154         //从1-50里面的所有偶数找出来,忽略前10个,放到一个list中
    155         List<Integer> list3 = Stream.iterate(1, x -> x + 1).limit(50).filter(n -> n % 2 == 0).skip(10).collect(Collectors.toList());
    156         System.out.println(list3);
    157         //类似分页效果, skip(10).limit(10) :跳过前10条,相当于查询第二页,每页10条
    158         List<Integer> list4 = Stream.iterate(1, x -> x + 1).limit(50).sorted((a,b) -> b -a).skip(10).limit(10).collect(Collectors.toList());
    159         System.out.println(list4);
    160         //////////////////////  Stream API - end  ////////////////////////
    161     }
    162 
    163     String put1(){
    164         return "world";
    165     }
    166 
    167     static String put(){
    168         return "hello";
    169     }
    170 
    171     void consume1(String string){
    172         System.out.println(string + ", 哈哈哈");
    173     }
    174     static void consume(String string){
    175         System.out.println(string + ", 哈哈哈");
    176     }
    177     static String convertUp(String a){
    178         return a.toUpperCase();
    179     }
    180     static Integer getLength(String a, String b){
    181         return a.length() + b.length();
    182     }
    183 }
    184 
    185 class Account{
    186     public Account(int age){
    187         System.out.println(age);
    188     }
    189 }
    190 
    191 class Person{
    192     public Person(){
    193         System.out.println("person 构造方法调用了");
    194     }
    195 }
    196 
    197 class Too{
    198     public void too(){
    199         System.out.println("invoke.............");
    200     }
    201 
    202     public void too1(String str){
    203         System.out.println(str + ",invoke.............");
    204     }
    205 
    206     public Integer too2(String p) {
    207         return 1;
    208     }
    209 }
  • 相关阅读:
    关于token的理解
    JavaScript 中 call()、apply()、bind() 的用法
    常用JS整理
    js里面for循环的++i与i++
    前端命名规范
    H5混合开发app常用代码
    jquery知识巩固
    水平垂直居中(固定宽不固定宽)
    css3新属性运用
    bug笔记(pc)
  • 原文地址:https://www.cnblogs.com/ningJJ/p/9185791.html
Copyright © 2011-2022 走看看