JAVA教程 从入门到精通 Day19

第十二章 Lambda

12.1 函数式接口

  • 只有一个必须被重写的抽象方法的接口
  • @FunctionalInterface 注解强制检测是否为函数式接口
  • java.util.function 包下提供了一系列的函数式接口
  • 方法的形参:函数式接口
  • 方法的实参:lambda表达式

四大内置函数式接口 :

Consumer 消费型接口

​ void accept(T t) 对给定的参数执行此操作

Function<T,R> 函数型接口

​ R apply(T t) 将此函数应用于给定的参数。

Supplier 供给型接口

​ T get() 获取结果

Predicate 段言型接口

​ boolean test(T t) 根据给定的参数计算此谓词

package Thursday;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

public class TestConsumer {
    public static void main(String[] args) {
        consumer(10000,money-> System.out.println("今日消费"+money));

        System.out.println(function("wang",str->str.toUpperCase()));

        System.out.println(supplier(5,()-> (int)(Math.random() * ((10 - 5) + 1)) + 5));

        System.out.println(predicate(List.of("汪超","常坤","赵士祥"),l->l.length()>=2));
    }

//    消费型接口
    public static void consumer(int money, Consumer<Integer> sc){
        sc.accept(money);
    }
//函数型接口

    public static String function(String str, Function<String,String> fc){
        return fc.apply(str);
    }

//    供给型接口
    public static List<Integer> supplier(int num, Supplier<Integer> pc){
        List<Integer> li=new ArrayList<>();
        for (int i=1;i<=num;i++){
            li.add(pc.get());
        }
        return li;
    }

//    断言型接口
    public static List<String> predicate(List<String> li,Predicate<String> pd){
        List<String> list =new ArrayList<>();
        for (String s:li){
            if (pd.test(s)){
                list.add(s);
            }
        }
        return list;
    }
}

12.2 方法引用

方法引用 :: (看得懂,能修改)

  • **作用:**简化lambda表达式的,是lambda表达式的另外一种变现形式

  • **前提 :**当lambda体的实现是通过调用另外一个方法实现的,可以通过方法引用直接引用这个方法,用来简化

    完整的lambda表达式的结构

  • 语法:

    • 对象 :: 实例方法
    • 类名 :: 静态方法
    • 类名 :: 实例方法
  • 要求:

    ① lambda的参数列表与返回值要求能够一 一对应lambda体中所引用方法的参数列表与返回值

    ② lambda的返回值要求与所引用方法的返回值保持对应一致

​ lambda的参数列表如果只有一个参数 :作为调用所引用的成员方法的对象存在

​ lambda的参数列表如果存在多个参数 :第一个参数作为调用所引用的成员方法的对象存在,lambda的第

​ 二个参数开始,一 一对应匹配所引用方法的参数列表

package Thursday;

import java.io.PrintStream;
import java.sql.SQLOutput;
import java.util.Comparator;
import java.util.List;
import java.util.function.BiPredicate;
import java.util.function.Consumer;

public class Test {
    public static void main(String[] args) {
        test();
        test1();
        test2();
    }

//    类名 :: 实例方法
    public static void test2(){
//        BiPredicate<String,String> pre= (x,y)->x.equals(y);
        BiPredicate<String,String> pre= String::equals;
        System.out.println(pre.test(new String("wang"),"wee"));
    }

//    类名 :: 静态方法
    public static void test(){
//        Comparator<Integer> sc=(x,y)->Integer.compare(x,y);
        Comparator<Integer> sc=Integer::compare;
        System.out.println(sc.compare(100,123));
    }

//    对象 :: 实例方法
    public static void test1(){
        List<Integer> sd= List.of(1,2,3,4);
        PrintStream ps=System.out;
//        Consumer se=i->ps.println(i);
        sd.forEach(System.out::println);
    }
}

12.3 构造器引用

​ 数据类型 :: new

package Thursday;

import java.util.function.Function;
import java.util.function.Supplier;

public class Test {
    public static void main(String[] args) {
        test();
    }
    public static void test(){
        //lambda的参数列表匹配构造器的参数列表,lambda返回值就是所构建的对象--> 构造器引用
        //Supplier<Employee> sup= ()->new Employee();
        Supplier<Teacher> sup= Teacher::new;
        System.out.println(sup.get());

        //Function<String,Employee> fun = (s)->new Employee(s);
        Function<String,Teacher> fun = Teacher::new;
        System.out.println(fun.apply("zhangsan"));
    }
}

12.4 Stream

Stream :

​ 数据的渠道,用来操作由数据源(数组,集合)所产生的元素序列

​ IO :传输数据

​ Stream流 :操作数据,计算数据

​ 数组|集合 :存储数据

  • 特点:
    1.Stream流本身不会存储数据

    2.Stream不会修改数据源|源对象,每次回返回持有结果的新的流Stream

    3.延迟执行|惰性加载 :当获取终止行为时候,才会执行一系列的中间操作

    4.流都是一次性的流,不能重复使用多次,一旦使用过就已经被破坏

  • 步骤:
    1.创建Stream

    ​ 1)Collection->stream

    ​ 2)Arrays->stream (数组)

    ​ 3)Stream.of (值列表)

    2.一系列流式的中间操作(都会返回一个持有结果的新的流)

    3.终止行为

package Thursday;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class Stream1 {
    public static void main(String[] args) {
        Stream<Integer> sc =List.of(1,2,3,4,5,6).stream();
        sc.forEach(System.out::println);

        String[] arr={"wang","chao","good"};
        Stream<String> sd= Arrays.stream(arr);
        sd.forEach(System.out::println);

        Stream<Integer> se=Stream.of(5,4,3,2,1);
        se.forEach(System.out::println);
    }
}

12.5 中间操作

中间操作 :

1.过滤 Stream filter(Predicate<? super T> predicate);

2.去重 distinct() 比较equals与hashCode()

3.截取 limit(long) 从第一个开始截取几个

4.跳过 skip(long) 跳过前n个

5.排序 sorted() --> 内部比较器 sorted(Comparator) ->外部比较器

6.映射 map(Function fun) stream操作的每一个数据都所用于参数函数,映射成一个新的结果,最后返回一个持

有所有映射后的新的结果的流

package Thursday;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class Middle {
    public static void main(String[] args) {
        List<Teacher> sc =Arrays.asList(
                new Teacher("wangchao",22,22000),
                new Teacher("changkun",22,20000),
                new Teacher("zhaoshixiang",24,19000),
                new Teacher("jishuai",23,21000),
                new Teacher("jishuai",23,21000)
        );

//        构建流
        Stream<Teacher> st=sc.stream();
//        过滤
//        st=st.filter(s->s.getAge()>22);
//        去重 限制 跳过
//        st=st.distinct().limit(3).skip(1);

//        映射
//        Stream<Integer> se=st.map(s->s.getAge());

//        排序
//        ss=ss.sorted();
          st=st.sorted((x,y)->Integer.compare(x.getAge(),y.getAge()));


//        终止行为
        st.forEach(System.out::println);
    }
}

12.6 终止行为

终止行为:

1.遍历 foreach(Consumer)

2.查找与匹配

​ // allMatch-检查是否匹配所有元素

​ // anyMatch-检查是否至少匹配一个元素

​ // noneMatch-检查是否没有匹配所有元素

​ // findFirst-返回第一个元素

​ // findAny-返回当前流中的任意元素

​ // count-返回流中元素的总个数

​ // max-返回流中最大值

​ // min-返回流中最小值

3.规约 reduce

map->reduce

加工->计算结果

4.收集
collect( )

package Thursday;

import jdk.swing.interop.SwingInterOpUtils;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Middle {
    public static void main(String[] args) {
        List<Teacher> sc =Arrays.asList(
                new Teacher("wangchao",22,22000),
                new Teacher("changkun",22,20000),
                new Teacher("zhaoshixiang",24,19000),
                new Teacher("jishuai",23,21000),
                new Teacher("jishuai",23,21000)
        );

//        构建流
        Stream<Teacher> st=sc.stream();
//        System.out.println(st.distinct().allMatch(e->e.getAge()>20));
//        Optional<Teacher> sb= st.sorted((x, y)->Double.compare(y.getSal(),x.getSal())).findFirst();
//        System.out.println(sb.get());

//        System.out.println(st.distinct().count());
//        System.out.println(st.distinct().max((x,y)->Double.compare(y.getSal(),x.getSal())).get());

//        System.out.println(st.map(x->x.getSal()).reduce((x,y)->x+y).get());
//        终止行为
//        st.forEach(System.out::println);

//        System.out.println(st.distinct().collect(Collectors.counting()));
//        System.out.println(st.distinct().collect(Collectors.averagingDouble(Teacher::getSal)));
        System.out.println(st.distinct().collect(Collectors.toMap(Teacher::getSal,Teacher::getAge)));

    }
}

package Thursday;

import java.util.Objects;

public class Teacher implements Comparable<Teacher> {
        private String name;
        private int age;
        private double sal;

        public Teacher() {
        }

        public Teacher(String name, int age, double sal) {
                this.name = name;
                this.age = age;
                this.sal = sal;
        }

        public Teacher(String name) {
                this.name = name;
        }

        public String getName() {
                return name;
        }

        public void setName(String name) {
                this.name = name;
        }

        public int getAge() {
                return age;
        }

        public void setAge(int age) {
                this.age = age;
        }

        public double getSal() {
                return sal;
        }

        public void setSal(double sal) {
                this.sal = sal;
        }

        @Override
        public String toString() {
                return "Teacher{" +
                        "name='" + name + '\'' +
                        ", age=" + age +
                        ", sal=" + sal +
                        '}';
        }

        @Override
        public boolean equals(Object o) {
                if (this == o) return true;
                if (o == null || getClass() != o.getClass()) return false;
                Teacher teacher = (Teacher) o;
                return age == teacher.age && Double.compare(teacher.sal, sal) == 0 && Objects.equals(name, teacher.name);
        }

        @Override
        public int hashCode() {
                return Objects.hash(name, age, sal);
        }


        @Override
        public int compareTo(Teacher o) {
                return this.age-o.age;
        }
}
Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的定义 4. 使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的主从集群,可以做读写分离。缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器 j2wap j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端 JOpenID JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值