草庐IT

Lambda表达式和Collection集合

yaomagician 2023-03-28 原文

Lambda表达式

Lambda表达式理解

  • Lambda表达式是Jdk 8 开始新增的一种语法形式;作用:用于简化匿名内部类的代码写法

     

     

     

注意:Lambda表达式只能简化函数式接口的匿名内部类!!!

什么是函数式接口?

  • 有且仅有一个抽象方法的接口。

  • 注意:大部分函数式接口,上面可能会有一个@FunctionalInterface的注解,有该注解的接口就必定是函数式接口。

Lambda表达式的省略写法(进一步简化Lambda表达式的写法)

  • 参数类型可以省略不写。

  • l如果只有一个参数,参数类型可以省略,同时()也可以省略。

  • l如果Lambda表达式中的方法体代码只有一行代码,可以省略大括号不写,同时要省略分号!此时,如果这行代码是return语句,也必须去掉return关键字不写。

上代码

基于无参无返回值,无参有返回值,有参无返回值,有参有返回值

package com.itheima.yaoyao;
​
import java.util.Random;
​
public class LambdaDemo2 {
    public static void main(String[] args) {
        //基于匿名内部类调用useInterOne:分析有一个InterOne接口【快速创建接口的实现类对象】 怎么做!
        useInterOne(new InterOne() {
            @Override
            public void methodOne() {
                System.out.println("无参无返匿名内部类调用");
            }
        });
​
​
        //基于Lambda表达式调用useInterOne:分析(1)必须要传递InterOne接口实现类对象【省略】(2)必须要实现methodOne抽象方法【省略】
        //methodOne方法的逻辑【不能!】传递methodOne方法的逻辑(剩余的事情由Java来做) 【基于Lambda表达式来做methodOne方法的逻辑载体】
       useInterOne(()->{System.out.println("lambda表达式表示无参无返");});
​
​
        //基于匿名内部类调用useInterTwo
        useInterTwo(new InterTwo() {
            @Override
            public Integer methodTwo() {
                return 100;
            }
        });
​
​
        //基于Lambda表达式调用useInterTwo:分析(1)必须要传递InterTwo接口实现类对象【省略】(2)必须要实现methodTwo抽象方法【省略】
        //methodTwo方法的逻辑【不能!】传递methodTwo方法的逻辑(剩余的事情由Java来做) 【基于Lambda表达式来做methodTwo方法的逻辑载体】
        //如果Lambda实现的方法需要返回值就要在{}中return回满足要求的结果
​
        useInterTwo(()->{
            return new Random().nextInt(100);
        });
​
        //基于匿名内部类调用useInterThree
        useInterThree(new InterThree() {
            @Override
            public void methodThree(String name, String food) {
                System.out.println(name+"爱喝"+food);
            }
        });
​
​
        //基于Lambda表达式调用useInterThree:分析(1)必须要传递InterThree接口实现类对象【省略】(2)必须要实现methodThree抽象方法【省略】
        //methodThree方法的逻辑【不能!】传递methodThree方法的逻辑(剩余的事情由Java来做) 【基于Lambda表达式来做methodThree方法的逻辑载体】
        //如果Lambda表达式作为方法的载体,方法声明了形式参数,在Lambda的()中也要声明同样形式参数
        useInterThree( (String name,String food) ->{
            System.out.println(name + "爱吃"+"小鸡炖蘑菇");
        });
​
​
        //基于匿名内部类调用useInterFour
        useInterFour(new InterFour() {
            @Override
            public String methodFour(String foodOne, String foodTwo) {
                return foodOne+"炖"+foodTwo;
            }
        });
​
​
        //基于Lambda调用
         useInterFour((String foodOne, String foodTwo) ->{return foodOne + "炒"+ foodTwo ;});
​
    }
​
    //编写4个方法分别将四个接口作为方法的参数【传递四个接口中不同类型的方法Lambda表达式】
    //在编写方法的时候并不明确方法的具体逻辑是什么 【多态:传递进来的实现类的实现逻辑是什么,这里就执行什么逻辑】
    public static void useInterOne(InterOne interOne) {
        interOne.methodOne();
    }
​
    public static void useInterTwo(InterTwo interTwo) {
        Integer result = interTwo.methodTwo();
        System.out.println("useInterTwo Result:" + result);
    }
​
    public static void useInterThree(InterThree interThree) {
        interThree.methodThree("张二狗", "西红柿炒洋柿子");
    }
​
    public static void useInterFour(InterFour interFour) {
        String result = interFour.methodFour("大葱", "笨鸡蛋");
        System.out.println("useInterFour Result:" + result);
    }
}
​
@FunctionalInterface
interface InterOne {
    //无参无返回值的抽象方法
    void methodOne();
}
​
@FunctionalInterface
interface InterTwo {
    //无参有返回值的抽象方法
    Integer methodTwo();
}
​
@FunctionalInterface
interface InterThree {
    //有参无返回值的抽象方法
    void methodThree(String name, String food);
}
​
@FunctionalInterface
interface InterFour {
    //有参有返回值的抽象方法
    String methodFour(String foodOne, String foodTwo);
}
​

 


面试题:你开发的时候使用过Lambda吗? 【使用过!】

  
  面试题:有人说Lambda就是匿名内部类的代替的方式,你是否认同? 【不认同】
    答案:(1)Lambda只能作用于接口,匿名内部类可以作用于抽象类【子类对象】/接口【实现类对象】/具体类【子类对象】
    (2)Lambda只能作用于函数式接口【只能有一个抽象方法】,匿名内部类作用于接口【接口中可以有任意个数的抽象方法】
    (3)匿名内部类本质上是通过语法底层生成一个.class文件,Lambda表达式不会额外生成.class文件【会在代码执行的时候动态编译】
    (4)思想层面的不同,匿名内部类体现还是面向对象【对象】,Lambda表达式体现的是函数式思想【作为方法逻辑的载体而出现】
    
    

 

Collection集合

 

Collection是单列集合的祖宗,它规定的方法(功能)是全部单列集合都会继承的。

 

 

 

Collection的常见方法如下:

 

 

 

迭代器概述

迭代器是用来遍历集合的专用方式(数组没有迭代器),在Java中迭代器的代表是Iterator

Collection集合获取迭代器的方法:

 

 

 

Iterator迭代器中的常用方法

 

 

 

 

 

 

★注意事项:一次hasNext方法搭配一次next方法(否则容易越界) 迭代器是一次性的

★注意事项:不推荐在迭代过程中使用集合修改集合长度,如果要删除元素可以通过迭代器。

遍历Collection集合的三种方法

迭代器

 Collection<String> names = List.of("施恩", "徐宁", "郁保四", "李应", "周通", "公孙胜", "白胜", "汤隆", "张清", "皇甫端");
// 使用迭代器Iterator遍历集合中的元素
Iterator<String> iterator = names.iterator();
while (iterator.hasNext()){
    String next = iterator.next();
    System.out.println(next);
}

 

增强for循环

Collection<String> names = List.of("施恩", "徐宁", "郁保四", "李应", "周通", "公孙胜", "白胜", "汤隆", "张清", "皇甫端");
// 使用增强for循环遍历names集合
for (String name: names) {
    System.out.println(name);
}

 

lambda表达式

Collection<String> names = List.of("施恩", "徐宁", "郁保四", "李应", "周通", "公孙胜", "白胜", "汤隆", "张清", "皇甫端");
​
// 使用Lambda表达式循环遍历names集合
names.forEach(element->{
    System.out.println(element);
});
​
names.forEach(new Consumer<String>() {
    @Override
    public void accept(String s) {
        System.out.println(s);
    }
});

 

有关Lambda表达式和Collection集合的更多相关文章

  1. ruby 正则表达式 - 如何替换字符串中匹配项的第 n 个实例 - 2

    在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg

  2. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

  3. ruby - 正则表达式将非英文字母匹配为非单词字符 - 2

    @raw_array[i]=~/[\W]/非常简单的正则表达式。当我用一些非拉丁字母(具体来说是俄语)尝试时,条件是错误的。我能用它做什么? 最佳答案 @raw_array[i]=~/[\p{L}]/使用西里尔字符进行测试。引用:http://www.regular-expressions.info/unicode.html#prop 关于ruby-正则表达式将非英文字母匹配为非单词字符,我们在StackOverflow上找到一个类似的问题: https://

  4. ruby - 正则表达式在哪个位置失败? - 2

    我需要一个非常简单的字符串验证器来显示第一个符号与所需格式不对应的位置。我想使用正则表达式,但在这种情况下,我必须找到与表达式相对应的字符串停止的位置,但我找不到可以做到这一点的方法。(这一定是一种相当简单的方法……也许没有?)例如,如果我有正则表达式:/^Q+E+R+$/带字符串:"QQQQEEE2ER"期望的结果应该是7 最佳答案 一个想法:你可以做的是标记你的模式并用可选的嵌套捕获组编写它:^(Q+(E+(R+($)?)?)?)?然后你只需要计算你获得的捕获组的数量就可以知道正则表达式引擎在模式中停止的位置,你可以确定匹配结束

  5. ruby - 有没有办法从 ruby​​ case 语句中访问表达式? - 2

    我想从then子句中访问c​​ase语句表达式,即food="cheese"casefoodwhen"dip"then"carrotsticks"when"cheese"then"#{expr}crackers"else"mayo"end在这种情况下,expr是食物的当前值(value)。在这种情况下,我知道,我可以简单地访问变量food,但是在某些情况下,该值可能无法再访问(array.shift等)。除了将expr移出到局部变量然后访问它之外,是否有直接访问caseexpr值的方法?罗亚附注我知道这个具体示例很简单,只是一个示例场景。 最佳答案

  6. ruby - 正则表达式 - 排除一个字符 - 2

    这是一个例子:s="abcd+subtext@example.com"s.match(/+[^@]*/)Result=>"+subtext"问题是,我不想在其中包含“+”。我希望结果是“潜台词”,没有+ 最佳答案 您可以在正则表达式中使用括号来创建匹配组:s="abcd+subtext@example.com"s=~/\+([^@]*)/&&$1=>"subtext" 关于ruby-正则表达式-排除一个字符,我们在StackOverflow上找到一个类似的问题:

  7. ruby - 如何遍历 Ruby 中所有正则表达式匹配的字符串? - 2

    我们有一个字符串:“”这个正则表达式://i如何从当前字符串中获取所有匹配项? 最佳答案 "".scan(//)参见scan在ruby​​-docs上 关于ruby-如何遍历Ruby中所有正则表达式匹配的字符串?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6857852/

  8. Ruby 正则表达式匹配逗号,但忽略括号中的逗号 - 2

    我正在尝试通过正则表达式拆分参数列表。这是一个带有我的参数列表的字符串:"a=b,c=3,d=[1,3,5,7],e,f=g"我想要的是:["a=b","c=3","d=[1,3,5,7]","e","f=g"]我试过先行,但Ruby不允许使用动态范围后行,所以这行不通:/(?如何让正则表达式忽略方括号中的所有内容? 最佳答案 也许这样的东西对你有用:str.scan(/(?:\[.*?\]|[^,])+/)编辑再三考虑。简单的非贪婪匹配器在某些嵌套括号的情况下会失败。 关于Ruby正则

  9. ruby-on-rails - rails 上的 ruby : radio buttons for collection select - 2

    我有一个集合选择:此方法的单选按钮是什么?谢谢 最佳答案 Rails3中没有这样的助手。在Rails4中,它是collection_radio_buttons. 关于ruby-on-rails-rails上的ruby:radiobuttonsforcollectionselect,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/18525986/

  10. ruby - 查找重叠的正则表达式匹配项 - 2

    我想找到给定字符串中的所有匹配项,包括重叠匹配项。我怎样才能实现它?#Example"a-b-c-d".???(/\w-\w/)#=>["a-b","b-c","c-d"]expected#Solutionwithoutoverlappedresults"a-b-c-d".scan(/\w-\w/)#=>["a-b","c-d"],but"b-c"ismissing 最佳答案 在积极的前瞻中使用捕获:"a-b-c-d".scan(/(?=(\w-\w))/).flatten#=>["a-b","b-c","c-d"]参见Rubyde

随机推荐