Lambda表达式和Stream流

Lambda表达式

称为函数的编程思想 以一种尽量简化的格式 简化面向对象中的格式

  public static void main(String[] args) {
            //创建匿名内部类对象
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("开始执行。。。");
                }
            }).start();
            //使用lambda达式
            new Thread(()->{System.out.println("开始执行。。。。");
            }).start();
        }
  • Lambda表达式的格式
    (参数列表)->{方法体;返回值;}
    (参数列表)就是方法中传入的参数如果空参的话那么写个()
    ->固定用法 拿着参数去使用
    {}先些计算过程,然后返回值如果没就可以省略
    public static void main(String[] args) {
  public static void main(String[] args) {
            //创建匿名内部类对象
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("开始执行。。。");
                }
            }).start();
            //使用lambda达式
            new Thread(()->{System.out.println("开始执行。。。。");
            }).start();
        }
 //创建匿名内部类对象
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("开始执行。。。");
            }
        }).start();
        //使用lambda达式
        new Thread(()->{System.out.println("开始执行。。。。");
        }).start();
    }
  • Lambda参数和返回值
public class Demo01 {
    public static void main(String[] args) {
        //创建数组
        Integer[] arr={10,12,52,47,85};
        //对数组进性默认排序
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
        //对数组进行比较排序
        Arrays.sort(arr, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });
        System.out.println(Arrays.toString(arr));
        //使用Lambda表达式
        Arrays.sort(arr,(Integer o1,Integer o2 )->{return o1-o2;});
        System.out.println(Arrays.toString(arr));
    }
}

自定义对象

    public static void main(String[] args) {
      //创建person对象数组
        Person[] p=new Person[4];
        p[0]=new Person("张三",10);
        p[1]=new Person("王五",20);
        p[2]=new Person("麻子",30);
        p[3]=new Person("李四",40);
        Arrays.sort(p, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.age-o2.age;
            }
        });
        System.out.println(Arrays.toString(p));
        //使用Lambda表达式
        Arrays.sort(p,(Person o1,Person o2)->{return o2.age-o1.age; });
        //省略格式
        Arrays.sort(p,( o1, o2)->o2.age-o1.age);
        for (Person person : p) {
            System.out.println(person);
        }
    }
  • Lambda省略格式
    1.可以省略参数的类型
    2.如果参数只有一个可以省略括号
    3.如果{}中的代码就一句话 那么{},return 和;可以同时省略
    public static void main(String[] args) {
        //创建线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("开始执行。。。。");
            }
        }).start();
        //使用Lambda表达式
        new Thread(()-> System.out.println("开始执行。。。")).start();
    }
}
  • Lambda的使用前提
    只能用于替换 有且只有一个抽象方法的接口的匿名内部类对象这种接口称为函数式接口
    该表达具有上下文推断的功能 所以出现了省略格式

Stream流

Collection集合获取流
Stream s=集合对象.stream();
Map集合不能直接获取流但是能间接获取流
map.entrySet().stream();获取Map的键值对
map.keySet().stream();获取map键流
map.value(),stream();获取Map值
数组获取流
Stream<数组中的元素类型> s=Stream.of(数据类型变…量名);

//创建单列集合
        ArrayList<Integer> arr = new ArrayList<>();
        //添加流
        Stream<Integer> sArray = arr.stream();
        //创建一i个Map对象
        HashMap<Integer, String> map = new HashMap<>();
        //获取keySet流
        Stream<Integer> keys = map.keySet().stream();
        //获取Vlaue流
        Stream<String> streamVlaue = map.values().stream();
        //获取entrySet流
        Stream<Map.Entry<Integer, String>> streamStream = map.entrySet().stream();
        //数组流
        Integer[] arr1=new Integer[5];
        //获取流
        Stream<Integer> arr11 = Stream.of(arr1);

###流的常用方法

  1. forEach() 逐个处理
//获取流
        Stream<String> stringStream = Stream.of("1111", "22", "333", "4444444");
        //使用匿名内部类
        stringStream.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });

2.skip 跳过前几个

Stream<String> skip = stringStream.skip(3);
        skip.forEach(s-> System.out.println(s));

3.limit() 抓取前几个

Stream<String> limit = stringStream.limit(2);
        limit.forEach(s-> System.out.println(s));

4.concat()合并流

Stream<String> one = Stream.of("one", "two");
        Stream<Integer> two = Stream.of(1, 2);
        Stream<Object> concat = Stream.concat(one, two);
        concat.forEach(s-> System.out.println(s));

5.map 映射

Stream<Integer> integerStream = stringStream.map(new Function<String, Integer>() {
            @Override
            public Integer apply(String s) {
                return s.length();
            }
        });
       
       //简化
        /*Stream<Integer> integerStream = stringStream.map(s -> s.length());
        integerStream.forEach(s-> System.out.println(s));*/

6.filter过滤

Stream<String> stringStream1 = stringStream.filter(new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.length()>2;
            }
        });
        Stream<String> stringStream1 = stringStream.filter(s ->s.length()>2);
        System.out.println(stringStream1.count());

7.count 统计

System.out.println(stringStream.count());

使用Stream

  List<String> one = new ArrayList<>();
        one.add("迪丽热巴");
        one.add("宋远桥");
        one.add("苏星河");
        one.add("老子");
        one.add("庄子");
        one.add("孙子");
        one.add("洪七公");
        List<String> two = new ArrayList<>();
        two.add("古力娜扎");
        two.add("张无忌");
        two.add("张三丰");
        two.add("赵丽颖");
        two.add("张二狗");
        two.add("张天爱");
        two.add("张三");
//        1. 第一个队伍只要名字为3个字的成员姓名;
//        2. 第一个队伍筛选之后只要前3个人;
        Stream<String> s1 = one.stream().filter(s -> s.length() == 3).limit(3);
//        3. 第二个队伍只要姓张的成员姓名;
//        4. 第二个队伍筛选之后不要前2个人;
        Stream<String> s2 = two.stream().filter(s -> s.startsWith("张")).skip(2);

//        5. 将两个队伍合并为一个队伍;
        ArrayList<String> arrayList = new ArrayList<>();
        Stream<String> concat = Stream.concat(s1,s2);

//        6. 根据姓名创建 Person 对象; string -- person
        Stream<Person> personStream = concat.map(s -> new Person(s));

//        7. 打印整个队伍的Person对象信息
         personStream.forEach(s-> System.out.println(s));
         package Stream_Test;

public class Person {
    String name;

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

    public Person() {

    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                '}';
    }
}

  • 函数拼接和终结的方法
    函数的拼接:由于方法返回的是流对象,所以支持链式编程 skip concat limit map filter 该方法啊返回的流对象
    终结:由于终结方法返回的不是流不支持链式编程所以当某个流对象调用 forEach count方法就会关闭流
  • 收集Stream的结果
    可以将流收集到集合中去 方法Collectors.toList()
    收集到数组中去 .Conllectors.toSet();
    一个流智能收集一次
    如果收集到数组中去 收集的对象是Object
 //创建流对象
        Stream<String> s = Stream.of("张三", "李四", "王二");
        //将流收集到集合中去
        List<String> list=s.collect(Collectors.toList());
        System.out.println(list);
        Object[] objects = list.toArray();
        for (Object object : objects) {
            System.out.println(object);
        }
        //将流收集到数组中去
        Set<String> set=s.collect(Collectors.toSet());
        Object[] ob = set.toArray();
        for (Object o : ob) {
            System.out.println(o);
        }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值