//方法一 Arrays类
String[] a = {"A","B","C"}
String[] b = {"D","E"}
// List<String>list = Arrays.asList(a) --OK
// List<String>list = Arrays.asList("A","B","C")--OK
// list.add("F")--UnsupportedOperationException
// list.remove("A")--UnsupportedOperationException
// list.set(1,"javaee")--OK (因为是把数组转为集合,其本质还是数组,数组长度固定不变,但内容可以改变)
// 结论:虽然可以把数组转为集合,但是集合长度不能改变
List list = new ArrayList(Arrays.asList(a))
list.addAll(Arrays.asList(b))
String[] str = new String[list.size()]
list.toArray(str)
for(int x=0x<str.lengthx++){
System.out.print(str[x] + " ")
}
//方法二 循环遍历
// 两个数组合并
String[] str1 = {"Hello","world","java"}
String[] str2 = {"Veriable","syntax","interator"}
String[] newStr = new String[str1.length+str2.length]
//newStr = str1数组是引用类型
for(int x=0x<str1.lengthx++){
newStr[x] = str1[x]
}
for(int y=0y<str2.lengthy++){
newStr[str1.length+y]=str2[y]
}
for(int y=0y<newStr.lengthy++){
System.out.println(newStr[y] + " ")
}
// 方法三
String[] str1 = {"Hello","world","java"}
String[] str2 = {"Veriable","syntax","interator"}
int str1Length = str1.length
int str2length = str2.length
str1 = Arrays.copyOf(str1, str1Length+str2length)//数组扩容
System.arraycopy(str2, 0, str1, str1Length, str2length)
System.out.println(Arrays.toString(str1))
java8中stream的提供了一个拼接流的方法Stream.concat,可以将两个stream拼接成一个stream, 保持了两个stream中的元素顺序。
那么如果我们需要对多个集合中的元素拼接成一个stream来统一处理,可以怎么做呢?
比如有三个Collection<String>c1, c2, c3.
方法一,使用Stream.concat方法来拼接,可以使用一个for循环来处理。
private static Stream<String> concat1(List<Collection<String>>collections) {
Stream result = Stream.empty()
for (Collection<String>strings : collections) {
result = Stream.concat(result, strings.stream())
}
return result
}
方法二,使用flatMap方法,将集合变成stream, 再压平
private static Stream<String> concat2(List<Collection<String>>collections) {
return collections.stream()
.flatMap(Collection::stream)
}
对于不同集合类型的数据,如何做成一个统一的流?还是可以使用flatMap方法来做
方法三:
private static Stream<String> concat3(List<String>s1,String[] s2, Set<String>s3) {
return Stream.of(s1.stream(), Arrays.stream(s2), s3.stream())
.flatMap(Function.identity())
}
方法三和方法二相比,可以使用不同类型的集合类型来拼接流,方法二在拥有共同基类的情况下使用会显得简洁很多。
下面的例子讲了如何合并两个java list, 用简单的方法,而不用自己去造轮子,循环list 去做,用如下建档方法:
import java.util.ArrayListimport java.util.Listpublic class JoinList {
public static void main(String[] args) {
List<String>listA = new ArrayList<String>() listA.add("A")
List<String>listB = new ArrayList<String>() listB.add("B")
List<String>listFinal = new ArrayList<String>
() listFinal.addAll(listA) listFinal.addAll(listB)
//same result //List<String>listFinal = new ArrayList<String>
(listA) //listFinal.addAll(listB)
System.out.println("listA : " + listA) System.out.println("listB : " + listB) System.out.println("listFinal : " + listFinal)
}}
你可以看到结果如下:
listA : [A]listB : [B]listFinal : [A, B]
其实最关键的就是调用 list 的 addall 方法,apache 的 listUtil , 里面有个 union 方法,其实也是用的 addall 方法。