前段时间,在公司熟悉新代码,发现好多都是新代码,全是 Java8语法,之前没有了解过,一直在专研技术的深度,却忘了最初的语法,所以,今天总结下Stream ,算是一份自己理解,不会很深入,就讲讲常用的 java8 也出来好久了,接口默认方法, Stream 作为 java8 的新特性,基于 lambda 表达式,Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream API 借助于同样新出现的Lambda表达式,极大的提高编程效率和程序可读性。 Stream 的原理:将要处理的元素看做一种流,流在管道中传输,并且可以在管道的节点上处理,包括过滤筛选、去重、排序、聚合等。元素流在管道中经过中间操作的处理,最后由最终操作得到前面处理的结果。 集合有两种方式生成流: stream() − 为集合创建串行流 parallelStream() – 为集合创建并行流 中间操作主要有以下方法(此类型方法返回的都是 Stream):map (mapToInt, flatMap 等)、 终止操作主要有以下方法: 为了让大家更好的理解 Stream,这里举个粒子,如果看的的不爽,你就使用lombok吧 首先为了说明 Stream 对对象集合的操作,新建一个 Student 类(学生类), 覆写了 equals() 和 hashCode() 方法 filter(筛选) 运行结果: 这里我们创建了四个学生,经过 filter 的筛选,筛选出地址是浙江的学生集合。 map(转换) distinct(去重) 运行结果: 可以看出,两个重复的 “肖战” 同学进行了去重,这不仅因为使用了 distinct()方法,而且因为 Student 对象重写了 equals 和 hashCode()方法,否则去重是无效的。 sorted(排序) 运行结果: 运行结果: 上面指定排序规则,先按照学生的 id 进行降序排序,再按照年龄进行降序排序 limit(限制返回个数) 运行结果: skip(删除元素) 运行结果: reduce(聚合) 运行结果: min(求最小值) 运行结果: 上面是求所有学生中年龄最小的一个,max 同理,求最大值。 anyMatch/allMatch/noneMatch(匹配) 运行结果 anyMatch:Stream 中任意一个元素符合传入的 predicate,返回 true allMatch:Stream 中全部元素符合传入的 predicate,返回 true noneMatch:Stream 中没有一个元素符合传入的 predicate,返回 true 上面介绍了 Stream 常用的一些方法,虽然对集合的遍历和操作可以用以前常规的方式,但是当业务逻辑复杂的时候,你会发现代码量很多,可读性很差,明明一行代码解决的事情,你却写了好几行。试试 lambda 表达式,试试 Stream,你会有不一样的体验。只记录工作需要,其他更深入的东西要多敲、多练、多思考
lambda表达式,函数式接口,Date API 等特性还是有必要去了解一下。比如在项目中经常用到集合,遍历集合可以试下 lambda 表达式,经常还要对集合进行过滤和排序,Stream 就派上用场了。用习惯了,不得不说真的很好用。
上图中是 Stream 类的类结构图,里面包含了大部分的中间和终止操作。filter、 distinct、 sorted、 peek、 limit、 skip、 parallel、 sequential、 unorderedforEach、 forEachOrdered、toArray、 reduce、 collect、 min、 max、 count、 anyMatch、 allMatch、 noneMatch、findFirst、 findAny、 iteratorpublic class Student { private Long id; private String name; private int age; private String address; public Student() {} public Student(Long id, String name, int age, String address) { this.id = id; this.name = name; this.age = age; this.address = address; } @Override public String toString() { return "Student{" + "id=" + id + ", + name + ''' + ", age=" + age + ", address='" + address + ''' + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; return age == student.age && Objects.equals(id, student.id) && Objects.equals(name, student.name) && Objects.equals(address, student.address); } @Override public int hashCode() { return Objects.hash(id, name, age, address); } public Long getId() { return id; } public void setId(Long id) { this.id = id; } 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 String getAddress() { return address; } public void setAddress(String address) { this.address = address; } } public static void main(String [] args) { Student s1 = new Student(1L, "肖战", 15, "浙江"); Student s2 = new Student(2L, "王一博", 15, "湖北"); Student s3 = new Student(3L, "杨紫", 17, "北京"); Student s4 = new Student(4L, "李现", 17, "浙江"); List<Student> students = new ArrayList<>(); students.add(s1); students.add(s2); students.add(s3); students.add(s4); List<Student> streamStudents = testFilter(students); streamStudents.forEach(System.out::println); } /** * 集合的筛选 * @param students * @return */ private static List<Student> testFilter(List<Student> students) { //筛选年龄大于15岁的学生 // return students.stream().filter(s -> s.getAge()>15).collect(Collectors.toList()); //筛选住在浙江省的学生 return students.stream().filter(s ->"浙江".equals(s.getAddress())).collect(Collectors.toList()); }

public static void main(String [] args) { Student s1 = new Student(1L, "肖战", 15, "浙江"); Student s2 = new Student(2L, "王一博", 15, "湖北"); Student s3 = new Student(3L, "杨紫", 17, "北京"); Student s4 = new Student(4L, "李现", 17, "浙江"); List<Student> students = new ArrayList<>(); students.add(s1); students.add(s2); students.add(s3); students.add(s4); testMap(students); } /** * 集合转换 * @param students * @return */ private static void testMap(List<Student> students) { //在地址前面加上部分信息,只获取地址输出 List<String> addresses = students.stream().map(s ->"住址:"+s.getAddress()).collect(Collectors.toList()); addresses.forEach(a ->System.out.println(a)); } 
public static void main(String [] args) { testDistinct1(); } /** * 集合去重(基本类型) */ private static void testDistinct1() { //简单字符串的去重 List<String> list = Arrays.asList("111","222","333","111","222"); list.stream().distinct().forEach(System.out::println); } 
public static void main(String [] args) { testDistinct2(); } /** * 集合去重(引用对象) */ private static void testDistinct2() { //引用对象的去重,引用对象要实现hashCode和equal方法,否则去重无效 Student s1 = new Student(1L, "肖战", 15, "浙江"); Student s2 = new Student(2L, "王一博", 15, "湖北"); Student s3 = new Student(3L, "杨紫", 17, "北京"); Student s4 = new Student(4L, "李现", 17, "浙江"); Student s5 = new Student(1L, "肖战", 15, "浙江"); List<Student> students = new ArrayList<>(); students.add(s1); students.add(s2); students.add(s3); students.add(s4); students.add(s5); students.stream().distinct().forEach(System.out::println); } 
public static void main(String [] args) { testSort1(); } /** * 集合排序(默认排序) */ private static void testSort1() { List<String> list = Arrays.asList("333","222","111"); list.stream().sorted().forEach(System.out::println); } 
public static void main(String [] args) { testSort2(); } /** * 集合排序(指定排序规则) */ private static void testSort2() { Student s1 = new Student(1L, "肖战", 15, "浙江"); Student s2 = new Student(2L, "王一博", 15, "湖北"); Student s3 = new Student(3L, "杨紫", 17, "北京"); Student s4 = new Student(4L, "李现", 17, "浙江"); List<Student> students = new ArrayList<>(); students.add(s1); students.add(s2); students.add(s3); students.add(s4); students.stream() .sorted((stu1,stu2) ->Long.compare(stu2.getId(), stu1.getId())) .sorted((stu1,stu2) -> Integer.compare(stu2.getAge(),stu1.getAge())) .forEach(System.out::println); } 
public static void main(String [] args) { testLimit(); } /** * 集合limit,返回前几个元素 */ private static void testLimit() { List<String> list = Arrays.asList("333","222","111"); list.stream().limit(2).forEach(System.out::println); } 
public static void main(String [] args) { testSkip(); } /** * 集合skip,删除前n个元素 */ private static void testSkip() { List<String> list = Arrays.asList("333","222","111"); list.stream().skip(2).forEach(System.out::println); } 
public static void main(String [] args) { testReduce(); } /** * 集合reduce,将集合中每个元素聚合成一条数据 */ private static void testReduce() { List<String> list = Arrays.asList("欢","迎","你"); String appendStr = list.stream().reduce("北京",(a,b) -> a+b); System.out.println(appendStr); } 
public static void main(String [] args) { testMin(); } /** * 求集合中元素的最小值 */ private static void testMin() { Student s1 = new Student(1L, "肖战", 14, "浙江"); Student s2 = new Student(2L, "王一博", 15, "湖北"); Student s3 = new Student(3L, "杨紫", 17, "北京"); Student s4 = new Student(4L, "李现", 17, "浙江"); List<Student> students = new ArrayList<>(); students.add(s1); students.add(s2); students.add(s3); students.add(s4); Student minS = students.stream().min((stu1,stu2) ->Integer.compare(stu1.getAge(),stu2.getAge())).get(); System.out.println(minS.toString()); } 
public static void main(String [] args) { testMatch(); } private static void testMatch() { Student s1 = new Student(1L, "肖战", 15, "浙江"); Student s2 = new Student(2L, "王一博", 15, "湖北"); Student s3 = new Student(3L, "杨紫", 17, "北京"); Student s4 = new Student(4L, "李现", 17, "浙江"); List<Student> students = new ArrayList<>(); students.add(s1); students.add(s2); students.add(s3); students.add(s4); Boolean anyMatch = students.stream().anyMatch(s ->"湖北".equals(s.getAddress())); if (anyMatch) { System.out.println("有湖北人"); } Boolean allMatch = students.stream().allMatch(s -> s.getAge()>=15); if (allMatch) { System.out.println("所有学生都满15周岁"); } Boolean noneMatch = students.stream().noneMatch(s -> "杨洋".equals(s.getName())); if (noneMatch) { System.out.println("没有叫杨洋的同学"); } } 
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算
官方软件产品操作指南 (170)