java学习--day24(stream流)

文章目录

1.基于接口和抽象类的匿名内部类的写法

复制代码
abstract class Person {
	public abstract void eat();
}
public static void main (String[] args) {
	Person person = new Person () {
		public void eat () {
			sout();
		}
	};
	person.eat();
}

2.接口和抽象类的区别

3.throw和throws区别

4.final和finally的区别

5.书写单例模式

6.序列化和反序列化的概念

今天的内容

1.Stream流

2.水果管理系统

1.Stream【难点】

Stream解决集合类库现有的弊端

先在有一个需求:

​ 将list集合中姓张的名字元素过滤到新的集合中

java 复制代码
package com.qfedu.a_stream;

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

public class Demo1 {
    public static void main(String[] args) {
        //将list集合中姓张的名字元素过滤到新的集合中
        List<String> list = new ArrayList<>();
        list.add("张三");
        list.add("张小三");
        list.add("李四");
        list.add("王五");
        list.add("张大山");
        //新建一个新的集合用来存姓张的元素
        List<String> list1 = new ArrayList<>();
        for (String s : list) {
            if (s.startsWith("张")) {
                list1.add(s);
            }
        }
        System.out.println(list1);
        System.out.println("=======");
        //如果使用sytream流操作
        //将集合对象转换成流对象
        list.stream().filter(s -> s.startsWith("张")).forEach(s -> System.out.println(s));

        list.stream().filter(new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.startsWith("张");
            }
        }).forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });
    }
}
1.1获取流的对象

根据集合获取流,将集合中的数据变成流的形式

Collection接口下面的方法 streram();

1.根据List获取流对象

java 复制代码
package com.qfedu.a_stream;

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

public class Demo2 {
 public static void main(String[] args) {
    List<String> strings = new ArrayList<>();
    strings.add("老邢");
    strings.add("老邢xiao");
    strings.add("xiao邢");
    strings.add("xiao老邢");
    //获取流对象
     Stream<String> stream = strings.stream();
     System.out.println(stream);
 }
}

2.set也可以获取stream对象

java 复制代码
package com.qfedu.a_stream;

import java.util.HashSet;
import java.util.Set;
import java.util.stream.Stream;

public class Demo3 {
 public static void main(String[] args) {
     Set<String> set = new HashSet<>();
     set.add("嘻嘻");
     set.add("哈哈");
     Stream<String> stream = set.stream();
     System.out.println(stream);
 }
}

3.根据map集合获取流对象

java 复制代码
package com.qfedu.a_stream;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.stream.Stream;

public class Demo4 {
 public static void main(String[] args) {
     Map<String, String> map = new HashMap<>();
     map.put("1", "李四");
     map.put("2", "张三");
     //先获取键
     Set<String> strings = map.keySet();
     Stream<String> stream = strings.stream();
     //获取值
     Collection<String> values = map.values();
     Stream<String> stream1 = values.stream();
     //
     Set<Map.Entry<String, String>> entries = map.entrySet();

     Stream<Map.Entry<String, String>> stream2 = entries.stream();

 }
}
1.2Stream流对象下面

流就是集合中的数据,方法对集合中进行操作的

方法的名称 方法的作用 方法种类 是否支持链式操作
count 统计个数 终结方法
forEach 逐个处理数据 终结方法
filter 过滤数据 函数的拼接
limit 取前几个 函数的拼接
skip 跳过前几个 函数的拼接
map 映射 函数的拼接
concat 拼接 函数的拼接

方法种类:

​ 终结方法:对流操作的时候,链式操作的时候一定是写在最后的

​ 函数拼接:方法还可以接着写方法

工厂的流水线:先造手机电池-》再造手机的主板-》造手机端额外壳-》一个成品

1.2.1count和forEach

count:统计流中的元素的个数

forEach:遍历数据的

java 复制代码
package com.qfedu.a_stream;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;

public class Demo5 {
    public static void main(String[] args) {
        List<String> strings = new ArrayList<>();
        strings.add("张三");
        strings.add("张三三");
        strings.add("李四");
        strings.add("lisi李四");

        long count = strings.stream().count();
        System.out.println(count);//4
        strings.stream().forEach(s->System.out.println(s));

    }
}
1.2.2filter方法
Stream<T> filter(Predicate<? super T> predicate)返回由与此给定谓词匹配的此流的元素组成的流。
Predicate 是一个判断接口,咱们可以写一写返回值是boolean类型
java 复制代码
package com.qfedu.a_stream;

import java.util.ArrayList;
import java.util.List;

public class Demo6 {
    public static void main(String[] args) {
        List<String> strings = new ArrayList<>();
        strings.add("张三");
        strings.add("张三三");
        strings.add("李四");
        strings.add("lisi李四");
        //filter 看数据流,如果返回的是一个true 就把它留到流中。如果是一个false就把从流中踢出去
        strings.stream().filter(s->s.endsWith("三")).forEach(s-> System.out.println(s));

    }
}
1.2.3limit

限制,取集合中前几个值

java 复制代码
package com.qfedu.a_stream;

import java.util.ArrayList;
import java.util.List;

public class Demo7 {
    public static void main(String[] args) {
        List<String> strings = new ArrayList<>();
        strings.add("张三");
        strings.add("张三三");
        strings.add("李四");
        strings.add("lisi李四");
        strings.add("老王");
        strings.add("老王八");
        strings.add("小王八");
        //找出前4个元素带有老的元素
        //strings.stream().limit(4).forEach(s-> System.out.println(s));
        strings.stream().limit(4).filter(s->s.contains("老")).forEach(s-> System.out.println(s));

    }
}
1.2.4map方法

用来映射关系

java 复制代码
package com.qfedu.a_stream;

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

public class Demo8 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("11");
        list.add("12");
        list.add("13");
        list.add("14");
        //将集合中集合中字符串转为int类型的数据打印
//        for (String s : list) {
//            System.out.println(Integer.parseInt(s));
//        }
        list.stream().map(s -> Integer.parseInt(s)).forEach(s-> System.out.println(s));
        list.stream().map(new Function<String, Integer>() {
            @Override
            public Integer apply(String s) {
                return Integer.parseInt(s);
            }
        }).forEach(new Consumer<Integer>() {
            @Override
            public void accept(Integer s) {
                System.out.println(s);
            }
        });
    }
}
1.2.5skip

跳过前几个,取m面的数据

java 复制代码
package com.qfedu.a_stream;

import java.util.ArrayList;
import java.util.List;

public class Demo9 {
    public static void main(String[] args) {
        List<String> strings = new ArrayList<>();
        strings.add("张三");
        strings.add("张三三");
        strings.add("李四");
        strings.add("lisi李四");
        strings.add("老王");
        strings.add("老王八");
        strings.add("小王八");
        strings.stream().skip(3).forEach(s-> System.out.println(s));
    }
}
1.2.6concat

合并两个流

java 复制代码
package com.qfedu.a_stream;

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

public class Demo10 {
    public static void main(String[] args) {
        List<String> strings = new ArrayList<>();
        strings.add("张三");
        strings.add("张三三");
        strings.add("李四");
    
        List<String> strings1 = new ArrayList<>();
        strings1.add("香蕉");
        strings1.add("菠萝");
        strings1.add("西瓜");
        strings1.add("葡萄");
        //先变成流,然后再合并
        Stream<String> stream = strings.stream();
        Stream<String> stream1 = strings1.stream();
        Stream<String> concat = Stream.concat(stream, stream1);
        concat.forEach(s-> System.out.println(s));
    }
}
1.3收集流

将流转为集合

toList();将流转为list集合

toSet();将流转为set集合

java 复制代码
package com.qfedu.a_stream;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Demo11 {
    public static void main(String[] args) {
        List<String> strings = new ArrayList<>();
        strings.add("张三");
        strings.add("张三三");
        strings.add("李四");
        strings.add("lisi李四");
        strings.add("老王");
        strings.add("老王八");
        strings.add("小王八");
        Stream<String> stream = strings.stream();
       List<String> collect = stream.collect(Collectors.toList());
        //Set<String> collect1 = stream.collect(Collectors.toSet());
        System.out.println(collect);
    }
}
相关推荐
在未来等你5 分钟前
设计模式精讲 Day 1:单例模式(Singleton Pattern)
java·设计模式·面向对象·软件架构
heart000_116 分钟前
基于 WebWorker 的 WebAssembly 图像处理吞吐量分析
java·图像处理·wasm
菜鸟阿达19 分钟前
Idea 2025 commit 关闭侧边栏 开启探框
java·ide·intellij-idea
雨果talk22 分钟前
【一文看懂多模块Bean初始化难题】Spring Boot多模块项目中的Bean初始化难题:包名不一致的优雅解决方案
java·spring boot·后端·spring·springboot
xiaowu08039 分钟前
C# 中的Async 和 Await 的用法详解
java·开发语言·c#
范纹杉想快点毕业44 分钟前
初探Qt信号与槽机制
java·c语言·开发语言·c++·qt·visualstudio·visual studio
哈喽姥爷44 分钟前
苍穹外卖--缓存菜品Spring Cache
java·缓存·spring cache·苍穹外卖·黑马
stein_java1 小时前
springMVC-13 文件下载及上传
java·spring
Cyanto1 小时前
Spring MVC 核心枢纽:DispatcherServlet 的深度解析与实践价值
java·spring·mvc
fuze23331 小时前
Spring MVC扩展消息转换器-->格式化时间信息
java·spring·mvc