Java 8 Concat Streams, Lists, Sets, Arrays详解

简介: Java8 新特性详解

Stream提供concat()方法来连接两个流并返回一个流。 要连接Lists,Sets和Arrays,我们首先将它们转换为流,然后使用concat()将它们组合起来。 可以使用收集器的方法将输出流转换为List,Set等,例如toList(),toSet()等。

static <T> Stream<T> concat(
Stream<? extends T> a, Stream<? extends T> b) 

concat()创建延迟连接流。 此流包含第一个流的所有元素,后跟第二个流的所有元素。 如果订购了两个输入流,则将对所得到的流进行排序。 如果两个流中的任何一个是平行的,则得到的流将是平行的。

import java.util.stream.Stream;
public class ConcatStreamsDemo {
    public static void main(String[] args) {
        Stream<String> s1 = Stream.of("AA", "BB", "CC");
        Stream<String> s2 = Stream.of("AA", "BB", "DD");
        Stream<String> s = Stream.concat(s1, s2);
        s.forEach(e->System.out.print(e+" "));
        //Remove duplicates using distinct()
        s1 = Stream.of("AA", "BB", "CC");
        s2 = Stream.of("AA", "BB", "DD");
        System.out.println("\nRemove duplicates using distinct()");
        s = Stream.concat(s1, s2).distinct();
        s.forEach(e->System.out.print(e+" "));
    }
}

输出:

AA BB CC AA BB DD 
Remove duplicates using distinct()
AA BB CC DD 

Concat Lists

在这个例子中,我们有两个列表。 这些列表将转换为流,然后使用concat()方法连接它们。 输出流将使用Collectors.toList()转换为List。 获得不同的元素

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class ConcatListsDemo {
    public static void main(String[] args) {
        List<Book> list1 = new ArrayList<>();
        List<Book> list2 = new ArrayList<>();
        {
           list1.add(new Book("Core Java", 200));
           list1.add(new Book("Spring MVC", 300));
           list1.add(new Book("Learning Freemarker", 150));  
           
           list2.add(new Book("Core Java", 200));
           list2.add(new Book("Spring MVC", 300));
           list2.add(new Book("Learning Hibernate", 400));            
        }
        List<Book> list = Stream.concat(list1.stream(), list2.stream()).collect(Collectors.toList());
        list.forEach(b->System.out.println(b.getName()+", "+ b.getPrice()));
        
        //Remove duplicates using distinct()
        System.out.println("--Remove duplicates using distinct()--");
        list = Stream.concat(list1.stream(), list2.stream()).distinct().collect(Collectors.toList());
        list.forEach(b->System.out.println(b.getName()+", "+ b.getPrice()));        
    }
} 

public class Book {
    private String name;
    private int price;
    public Book(String name, int price) {
    this.name = name;
    this.price = price;
    }
    public String getName() {
  return name;
    }
    public int getPrice() {
  return price;
    }
    @Override
    public boolean equals(final Object obj) {
      if (obj == null) {
         return false;
      }
      final Book book = (Book) obj;
      if (this == book) {
         return true;
      } else {
         return (this.name.equals(book.name) && 
                 this.price == book.price);
      }
    }
    @Override
    public int hashCode() {
      int hashno = 7;
      hashno = 13 * hashno + (name == null ? 0 : 
                              name.hashCode());
      return hashno;
    }
}

输出:

Core Java, 200
Spring MVC, 300
Learning Freemarker, 150
Core Java, 200
Spring MVC, 300
Learning Hibernate, 400
--Remove duplicates using distinct()--
Core Java, 200
Spring MVC, 300
Learning Freemarker, 150
Learning Hibernate, 400 

Concat Arrays


这些数组将转换为流,然后使用concat()方法连接它们。 输出流将使用Stream.toArray()转换为数组。 获得不同的元素
import java.util.stream.Stream;
public class ConcatArraysDemo {
    public static void main(String[] args) {
        Book[] bk1 = new Book[3];
        Book[] bk2 = new Book[3];        
        {
           bk1[0] = new Book("Core Java", 200);
           bk1[1] = new Book("Spring MVC", 300);
           bk1[2] = new Book("Learning Freemarker", 150);          
           bk2[0] = new Book("Core Java", 200);
           bk2[1] = new Book("Spring MVC", 300);
           bk2[2] = new Book("Learning Hibernate", 400);           
        }
        Book[] bks = (Book[]) Stream.concat(Stream.of(bk1), 
                      Stream.of(bk2)).toArray(b -> new Book[b]);
        for(Book b : bks) {
          System.out.println(b.getName()+", "+ b.getPrice());
        }
    
        //Remove duplicates using distinct()
        System.out.println("--Remove duplicates using distinct()--");
        bks = (Book[]) Stream.concat(Stream.of(bk1), Stream.of(bk2)).distinct().toArray(b -> new Book[b]);
        for(Book b : bks) {
          System.out.println(b.getName()+", "+ b.getPrice());
        }
    }
}

输出:

Core Java, 200
Spring MVC, 300
Learning Freemarker, 150
Core Java, 200
Spring MVC, 300
Learning Hibernate, 400
--Remove duplicates using distinct()--
Core Java, 200
Spring MVC, 300
Learning Freemarker, 150
Learning Hibernate, 400 

Concat Sets


这些集合将转换为流,然后使用concat()方法连接它们。 输出流将使用Collectors.toSet()转换为Set。

import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class ConcatSetsDemo {
    public static void main(String[] args) {
        Set<Book> set1 = new HashSet<>();
        Set<Book> set2 = new HashSet<>();
        {
           set1.add(new Book("Core Java", 200));
           set1.add(new Book("Spring MVC", 300));
           set1.add(new Book("Learning Freemarker", 150));  
           
           set2.add(new Book("Core Java", 200));
           set2.add(new Book("Spring MVC", 300));
           set2.add(new Book("Learning Hibernate", 400));           
        }
        Set<Book> set = Stream.concat(set1.stream(), set2.stream()).collect(Collectors.toSet());
        set.forEach(b->System.out.println(b.getName()+", "+ b.getPrice()));
    }
} 

输出:

Spring MVC, 300
Learning Freemarker, 150
Learning Hibernate, 400
Core Java, 200 
相关文章
|
Java API
【零基础学Java】—数组工具类Arrays(十七)
【零基础学Java】—数组工具类Arrays(十七)
|
Java API
使用Java Streams简化集合操作
在Java编程中,我们经常需要对集合进行各种操作,例如过滤、映射、排序等。传统的做法是使用迭代器或循环来遍历集合并执行相应的操作。然而,随着Java 8引入的Streams API,我们现在可以以更简洁和功能强大的方式处理集合操作。 Java Streams是一种用于处理数据流的API,它提供了一种函数式编程的方式来对集合进行操作。下面将介绍一些常见的用法示例。
62 1
|
1月前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
35 2
|
7月前
|
分布式计算 并行计算 Java
Java的流(Streams)与并行处理的技术性文章
Java的流(Streams)与并行处理的技术性文章
63 1
|
2月前
|
存储 安全 Java
列Java表(Lists)详解
在 Java 中,`List` 是一种用于存储有序集合的接口,允许重复元素,并提供了多种操作方法,如添加、删除、获取等。`List` 接口是 Java 集合框架的核心部分,常见的实现包括 `ArrayList`(动态数组)、`LinkedList`(双向链表)和 `Vector`(线程安全的动态数组)。
71 10
|
2月前
|
存储 安全 Java
Java数组(Arrays)详解
Java 中的数组是一种用于存储固定数量同类型数据的高效数据结构,支持连续内存存储和随机访问。数组可以声明并初始化,通过索引访问和修改元素,获取长度,使用循环遍历,支持多维形式,并可通过 `Arrays` 类的方法进行复制和排序。数组具有固定大小和类型安全的特点,但需注意越界等问题。灵活运用数组能显著提升编程效率。
135 9
|
4月前
|
Oracle Java 关系型数据库
Java10 Lambda 设计和实现问题之在双流 concat 的场景中,确保 s1 和 s2 流水线上的算子与 s3 流水线上的算子正确串联起来,如何实现
Java10 Lambda 设计和实现问题之在双流 concat 的场景中,确保 s1 和 s2 流水线上的算子与 s3 流水线上的算子正确串联起来,如何实现
|
5月前
|
Java
java lab8--------7-2 sdut-JAVA-Insert Integer element into array lists
java lab8--------7-2 sdut-JAVA-Insert Integer element into array lists
31 0
|
5月前
|
消息中间件 Java Kafka
Java中的流处理框架:Kafka Streams与Flink
Java中的流处理框架:Kafka Streams与Flink
|
5月前
|
Java 索引
Java中的Arrays类
Java中的Arrays类