方法名称 | 说明 |
---|---|
static list of(E …elements) | 创建一个具有指定元素集合list集合对象 |
staticlist of(E…elements) | 创建一个具有指定元素的set集合 |
static |
创建一个具有指定元素的Map集合 |
这个集合是不能删除和修改
List集合
/*不能添加修改操作*/
List<String> list = List.of("lishi", "changff", "zhangshan", "wangshang");
list.remove("lishi");
list.add("shuxili");
list.set(0,"bbbb");
package ImmutableDemo;
import java.util.Iterator;
import java.util.Set;
public class Demo2 {
public static void main(String[] args) {
Set<String> s=Set.of("lishi", "changff", "zhangshan", "wangshang","dkjkjf");
Iterator<String> it = s.iterator();
while (it.hasNext() ) {
System.out.println(it.next());
}
System.out.println("---------------");
System.out.println("---------------");
// s.remove("lishi");
// s.add("shuxili");
}
}
package ImmutableDemo;
import java.util.Map;
import java.util.Set;
public class Demo3 {
public static void main(String[] args) {
Map<String, String> mapDeom = Map.of("南京", "1000", "北京", "10000", "上海", "8000");
Set<String> keySet = mapDeom.keySet();
for (String s : keySet) {
System.out.println(s);
System.out.println(mapDeom.get(s));
}
System.out.println("---------");
Set<Map.Entry<String, String>> entries = mapDeom.entrySet();
for (Map.Entry<String, String> entry : entries) {
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key + "=" + value);
}
}
}
由于map集合的特殊,还有一种方法为Map.ofEntries( )方法可以传递多个键值对 对象
package ImmutableDemo;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class Demo4 {
public static void main(String[] args) {
HashMap<String,String> h =new HashMap<>();
h.put("aaa","111");
h.put("bbb","222");
h.put("ccc","333");
h.put("ddd","444");
h.put("eee","555");
/*先获取键值对,对像*/
Set<Map.Entry<String, String>> entries = h.entrySet();
Map.Entry[] array = entries.toArray(new Map.Entry[0]);/*先将键值对对象转化为数组,0长度不会影响,在底层会自动比较,
然后转成集合的长度*/
/*创建不可变集合*/
Map map = Map.ofEntries(array);/*可变集合底层是一个数组,可以将数组直接传过去*/
// map.put("fff","777");
// map.remove("aaa");
/*简写*/
Map<Object, Object> map1 = Map.ofEntries(h.entrySet().toArray(new Map.Entry[0]));
}
}
特点:
定义完成后不可以进行增删改
如何创建不可变集合
思想:工厂流水线,每个负责一项功能,结合lambda表达式来简化对数组的操作
Stream流的使用步骤:
1.得到一条Stream流,并添加数据
2.使用中间方法对流水线进行操作
3.使用终结方法结束对Stream的操作例如 sout
获取方法 | 方法名 | 说明 |
---|---|---|
单列集合 | default Stream stream() | Collection 中的默认方法 |
双列集合 | 无 | 无法直接使用stream流 |
数组 | Public static StramStream(T[] array) | Arrays工具类中的静态方法调用 |
一堆零散数据 | public staticStream of(T…value) | Stream接口中的静态方法 |
单列集合
public static void main(String[] args) {
/*单列集合直接调用,list是collections的实现类*/
ArrayList<String> list =new ArrayList<>();
Collections.addAll(list,"A","B","C","E","F","G");
list.stream().forEach(s -> System.out.println(s ));
}
public static void main(String[] args) {
HashMap<String,Integer> ha =new HashMap<>();
ha.put("aaa",1);
ha.put("bbb",2);
ha.put("ccc",3);
ha.put("ddd",4);
ha.put("eee",5);
/*获取键值 */
ha.keySet().stream().forEach(s -> System.out.println(s));
System.out.println();
/*获取键值对 对象,*/
ha.entrySet().stream().forEach(stringIntegerEntry -> System.out.println(stringIntegerEntry));
}
数组
注意事项:不能直接使用需要借助工具类arrays中的stream流
/*数组*/
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
String [] st ={"aaa","bbb","ccc"};
/*获取stream流*/
Arrays.stream(arr).forEach(s-> System.out.println(s));
System.out.println();
Arrays.stream(st).forEach(s1 -> System.out.println(s1));
}
零散数据
注意事项:数据的类型必须一致,在添加引用类型的数组是可以直接使用,但是基本数据类型的数组是不能使用的会吧整个数组当成一个元素直接传递到steam流中
public static void main(String[] args) {
Stream.of(1,2,3,4,5,6,7,8,9).forEach(s-> System.out.println(s));
}
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "aaa", "bbb", "ccc", "ddd", "eee");
list.stream().filter(new Predicate<String>() {
@Override
public boolean test(String s) {
/*true:留下 false:舍弃*/
return s.startsWith("a");
}
}).forEach(s -> System.out.println(s));
/*简化*/
list.stream().filter(s -> s.startsWith("a")).forEach(s -> System.out.println(s));
Limit 获取前几个元素,limit(个数)
/*limit获取前几元素,不是索引是元素*/
list.stream().limit(4)
.forEach(s -> System.out.println(s));
skip 跳过前几个元素,skip(个数)
/*skip跳过前几个元素*/
list.stream().skip(2)
.forEach(s -> System.out.println(s));
练习:
/*练习获取其中3-4*/
list.stream().limit(4)
.skip(2)
.forEach(s -> System.out.println(s));
System.out.println();
list.stream().skip(2)
.limit(2)
.forEach(s -> System.out.println(s));
System.out.println( );
/*流合并,类型一致,不会提升类型,不一致会提升到俩流的父类,不能使用单独流的特有功能*/
Stream.concat(list1.stream().distinct(),list.stream())
.forEach(s -> System.out.println(s));
Map 流的转换:
/*流的转换*/
list2.stream().map(new Function<String, Integer>() {
/*string表示流里面原来就有的数据
* integer表示的是要转换了之后的类型*/
@Override
public Integer apply(String s) {
String[] split = s.split("-");/*切割方法split*/
String s1 = split[1];
int i = Integer.parseInt(s1);/*integer中的转换方法*/
return i;
}
}).forEach(s -> System.out.println(s));
System.out.println("================================");
/*简化*/
list2.stream().map(s -> Integer.parseInt(s.split("-")[1])).forEach(s-> System.out.println(s));
终结方法:
/*遍历方式*/
list2.stream().forEach(s -> System.out.println(s));
统计
/*将Stream流中的数据进行统计*/
System.out.println(list2.stream().distinct().count());
收集流中的数据放到数组中
String[] array = list2.stream().toArray(new IntFunction<String[]>() {
@Override
public String[] apply(int value) {
return new String[value];
}
});
System.out.println(Arrays.toString(array));
/*简化*/
String[] array1 = list2.stream().toArray(value -> new String[value]);
System.out.println(Arrays.toString(array));
收集流中的数据放到集合里面
注意事项:
lis集合是不会去重复的
set集合是会去重复的
map里面的键值对不能重复
/*list*/
List<String> collect = list2.stream()
.filter(s -> "男".equals(s.split("-")[2]))
.collect(Collectors.toList());
System.out.println(collect);
/*set*/
Set<String> collect1 = list2.stream()
.filter(s -> "男".equals(s.split("-")[2]))
.collect(Collectors.toSet());
System.out.println(collect1);
/*迭代器遍历*/
Iterator<String> iterator = collect.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
/*增强for*/
for (String s : collect) {
System.out.println(s);
}
/*foreach*/
collect.forEach((s)-> { System.out.println(s); });
/*收集到map集合当中注意键值对不能重复*/
Map<String, Integer> mapcollect = list2.stream()
.filter(s -> "男".equals(s.split("-")[2]))
/*在map集合里面要传递2个数据,键的获取规则,值的获取规则*/
/*在键或者值里面有2个类型第一个表示流里面的类型,第二个表示键或者值里面的类型,他们是交叉对应的*/
.collect(Collectors.toMap(new Function<String, String>() {
@Override
public String apply(String s) {
return s.split("-")[0];
}
}, new Function<String, Integer>() {
@Override
public Integer apply(String s) {
return Integer.parseInt(s.split("-")[1]);
}
}));
/*简化*/
Map<String, Integer> mapcollect2 = list2.stream()
.filter(s -> "男".equals(s.split("-")[2]))
.collect(Collectors.toMap(
s -> s.split("-")[0]
,
s -> Integer.parseInt(s.split("-")[1])
));
System.out.println(mapcollect2);
System.out.println(mapcollect);