lambda认识

Java8新特性

为什么学习java8新特性?

1.代码简洁,函数式编程写出的代码简洁且意图明确,⽐如使⽤stream接⼝让你告别for循环。
2.多核友好,Java函数式编程使得编写并⾏程序如此简单,只需要调⽤⼀下parallel()⽅法即可。

什么是lambda表达式?

“->”被称为lambda操作符或者箭头符。----固定语法

他把lambda分为两个部分:

左侧:指定人lambda表达式需要的所有参数------参数,run方法不需要呀参数可以直接写()

右侧:指定了lambda体,即lambda表达式要执行的任务、功能或者说是行为。-----方法体

什么是函数式接口

接口有且只有一个抽象方法

改造成lambda表达式需要满足什么条件

1.可选类型声明:不需要声明参数类型,编译器可以统一识别参数值

list.forEach((x) -> System.out.println(x));

2.可选的参数圆括号();一个参数无需定义圆括号,但是多个参数需要定义圆括号

list.forEach(x-> System.out.println(x));
map.forEach((x,y)-> System.out.println(x+y));

3。可选的大括号{ }:如果主体包含了一个语句,就不需要使用{ }

list.forEach(x-> System.out.println(x));

4.可选的返回关键字return,如果主体只有一个表达式返回值则可以省略return写成和{ }

list.stream().sorted((s1,s2) ->s2.compareTo(s1)).forEach(x-> System.out.println(x));

常见的函数接口

有参数类型的有Consumer(消费型接口),Predicate(断言型接口),Function(函数型接口),

无参数的有Supplier(供货型接口)

Consumer的方法accept()返回值类型void ----- Supplier的方法get() 返回值类型 T ------- Function<T,R>的方法apply()返回值类型R ---- Predicate的方法teat()返回值类型为boolea

方法引用语法

对象名的引用::实例名方法

类名::静态方法名

类名::实例方法名

类名::new(构造器引用)

接⼝冲突

当同时实现的多个接⼝中存在签名⼀样的若⼲个⽅法体实现(⽆论内容是否完全相同)时,实现类必须进⾏覆盖重写以解决冲突。

在这里插入图片描述

private static List<String> list = Arrays.asList("c","b","a");
 private static Map<String,String> map = new HashMap<>(){
     {
         this.put("⼿机","⼩⽶");
         this.put("笔记本","苹果笔记本");
         this.put("⿏标","罗技⿏标");
     }
 };

 public static void main(String[] args) {
     //1.可选类型声明:不需要声明参数类型,编译器可以统⼀识别参数值。
     list.forEach((x) -> System.out.println(x));
     System.out.println("----------");
     //2.可选的参数圆括号():⼀个参数⽆需定义圆括号,但多个参数需要定义圆括号()。
     list.forEach(x-> System.out.println(x));
     map.forEach((x,y)-> System.out.println(x+y));
     System.out.println("----------");
     //3.可选的⼤括号{}:如果主体包含了⼀个语句,就不需要使⽤{}。
     list.forEach(x-> System.out.println(x));
     map.forEach((x,y)->{
         System.out.println(x);
         System.out.println(y);
     });
     System.out.println("----------");
     //4.可选的返回关键字return:如果主体只有⼀个表达式返回值则可以省略return和{}
     list.stream().sorted((s1,s2) ->s2.compareTo(s1)).forEach(x-> System.out.println(x));

 }
 private static Lambda2 lambda2 = new Lambda2();

    public static void main(String[] args) {
//        lambda2.shop(100, new Consumer<Integer>() {
//            @Override
//            public void accept(Integer integer) {
//                System.out.println("消费了"+integer+"元");
//            }
//        });
        lambda2.shop(100, money -> System.out.println("消费了" + money + "元"));
//        lambda2.getCode(5, new Supplier<Integer>() {
//            @Override
//            public Integer get() {
//                return new Random().nextInt(10);
//            }
//        });
        String code = lambda2.getCode(5, () -> new Random().nextInt(10));
        System.out.println("code = " + code);

//        int asda = lambda2.getStringRealLength("asda", new Function<String, Integer>() {
//            @Override
//            public Integer apply(String s) {
//                int length = s.length();
//                return length;
//            }
//        });
        int asda = lambda2.getStringRealLength("asda", s -> s.length());
        System.out.println("asda = " + asda);
        List<String> list = Arrays.asList("asdasd", "asd", "asd", "a");
        List<String> string = lambda2.getString(list, new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.length() > 5;
            }
        });
        lambda2.getString(list, s -> s.length() > 5);
        System.out.println("string = " + string);
    }

    //需求1:编写shop⽅法输出消费多少元
    public void shop(int money, Consumer<Integer> consumer) {
        consumer.accept(money);
    }

    //需求2:编写getCode⽅法返回指定位数的随机验证码字符串
    public String getCode(int num, Supplier<Integer> supplier) {
        StringBuilder str = new StringBuilder();
        for (int i = 0; i < num; i++) {
            str.append(supplier.get());
        }
        return str.toString();
    }

    // 需求3:编写getStringRealLength⽅法返回字符串真实⻓度
    public int getStringRealLength(String str, Function<String, Integer> function) {
        return function.apply(str);
    }

    // /需求4:编写getString⽅法返回⻓度⼤于5的字符串的集合
    public List<String> getString(List<String> list, Predicate<String> predicate) {
        ArrayList<String> list1 = new ArrayList<>();
        for (String string : list) {
            if (predicate.test(string)) {
                list1.add(string);
            }
        }
        return list1;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值