- 说到Stream便容易想到I/O Stream,而实际上,谁规定“流”就一定是“IO流”呢?在Java 8中,得益于Lambda所带来的函数式编程
- 引入了一个全新的Stream概念,用于解决已有集合+数组既有的弊端。
public class Demo02Stream {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张无忌");
list.add("周芷若");
list.add("赵敏");
list.add("张强");
list.add("张三丰");
list.stream()
.filter(name->name.startsWith("张"))
.filter(name->name.length()==3)
.forEach(name-> System.out.println(name));
}
}
- 使用一个流的时候,通常包括三个基本步骤:获取一个数据源(source)→ 数据转换→执行操作获取想要的结果,每次转换原有 Stream 对象不改变,返回一个新的 Stream 对象(可以有多次转换)
获取流
- java.util.stream.Stream 是Java 8新加入的最常用的流接口。(这并不是一个函数式接口。)
- 获取一个流非常简单,有以下几种常用的方式:
- 所有的 Collection 集合都可以通过 stream 默认方法获取流;
- Stream 接口的静态方法 of 可以获取数组对应的流。
public class Demo01GetStream {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
Stream<String> stream1 = list.stream();
Set<String> set = new HashSet<>();
Stream<String> stream2 = set.stream();
Map<String,String> map = new HashMap<>();
Set<String> keySet = map.keySet();
Stream<String> stream3 = keySet.stream();
Collection<String> values = map.values();
Stream<String> stream4 = values.stream();
Set<Map.Entry<String, String>> entries = map.entrySet();
Stream<Map.Entry<String, String>> stream5 = entries.stream();
Stream<Integer> stream6 = Stream.of(1, 2, 3, 4, 5);
Integer[] arr = {1,2,3,4,5};
Stream<Integer> stream7 = Stream.of(arr);
String[] arr2 = {"a","bb","ccc"};
Stream<String> stream8 = Stream.of(arr2);
}
}
forEach
public class Demo02Stream_forEach {
public static void main(String[] args) {
Stream<String> stream = Stream.of("张三", "李四", "王五", "赵六", "田七");
stream.forEach(name->System.out.println(name));
}
}
filter
public class Demo03Stream_filter {
public static void main(String[] args) {
Stream<String> stream = Stream.of("张三丰", "张翠山", "赵敏", "周芷若", "张无忌");
Stream<String> stream2 = stream.filter((String name)->{return name.startsWith("张");});
stream2.forEach(name-> System.out.println(name));
stream.forEach(name-> System.out.println(name));
}
}
map
public class Demo04Stream_map {
public static void main(String[] args) {
Stream<String> stream = Stream.of("1", "2", "3", "4");
Stream<Integer> stream2 = stream.map((String s)->{
return Integer.parseInt(s);
});
stream2.forEach(i-> System.out.println(i));
}
}
count
public class Demo05Stream_count {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(6);
list.add(7);
Stream<Integer> stream = list.stream();
long count = stream.count();
System.out.println(count);
}
}
limit
public class Demo06Stream_limit {
public static void main(String[] args) {
String[] arr = {"美羊羊","喜洋洋","懒洋洋","灰太狼","红太狼"};
Stream<String> stream = Stream.of(arr);
Stream<String> stream2 = stream.limit(3);
stream2.forEach(name-> System.out.println(name));
}
}
skip
public class Demo07Stream_skip {
public static void main(String[] args) {
String[] arr = {"美羊羊","喜洋洋","懒洋洋","灰太狼","红太狼"};
Stream<String> stream = Stream.of(arr);
Stream<String> stream2 = stream.skip(3);
stream2.forEach(name-> System.out.println(name));
}
}
concat
public class Demo08Stream_concat {
public static void main(String[] args) {
Stream<String> stream1 = Stream.of("张三丰", "张翠山", "赵敏", "周芷若", "张无忌");
String[] arr = {"美羊羊","喜洋洋","懒洋洋","灰太狼","红太狼"};
Stream<String> stream2 = Stream.of(arr);
Stream<String> concat = Stream.concat(stream1, stream2);
concat.forEach(name-> System.out.println(name));
}
}
toMap
@Test
public void lambatoMap(){
List<User> list = new ArrayList<>();
User user1 = new User("张三",15,"男");
User user2 = new User("李四",22,"男");
User user3 = new User("张三",22,"男");
User user4 = new User("赵六",15,"男");
User user5 = new User("李世民",28,"男");
User user6 = new User("杨贵妃",18,"女");
User user7 = new User("李四",15,"女");
list.add(user1);
list.add(user2);
list.add(user3);
list.add(user4);
list.add(user5);
list.add(user6);
list.add(user7);
Map<Integer, User> collect = list.stream().collect(Collectors.toMap(User::getAge, a -> a,(k1, k2)->k1));
System.out.println(collect);
}
sum
@Test
public void lambamapToInt(){
List<User> list = new ArrayList<>();
User user1 = new User("张三",15,"男");
User user2 = new User("李四",22,"男");
User user3 = new User("张三",22,"男");
User user4 = new User("赵六",15,"男");
User user5 = new User("李世民",28,"男");
User user6 = new User("杨贵妃",18,"女");
User user7 = new User("李四",15,"女");
list.add(user1);
list.add(user2);
list.add(user3);
list.add(user4);
list.add(user5);
list.add(user6);
list.add(user7);
int totalAge = list.stream().mapToInt(User::getAge).sum();
System.out.println("和:" + totalAge);
}
groupingBy
@Test
public void lambagroupBy(){
List<User> list = new ArrayList<>();
User user1 = new User("张三",15,"男");
User user2 = new User("李四",22,"男");
User user3 = new User("张三",22,"男");
User user4 = new User("赵六",15,"男");
User user5 = new User("李世民",28,"男");
User user6 = new User("杨贵妃",18,"女");
User user7 = new User("李四",15,"女");
list.add(user1);
list.add(user2);
list.add(user3);
list.add(user4);
list.add(user5);
list.add(user6);
list.add(user7);
Map<String, List<User>> groupBy = list.stream().collect(Collectors.groupingBy(User::getName));
Map<String, Map<Integer, List<User>>> groupBy = list.stream().collect(Collectors.groupingBy(User::getName,User::getAge));
System.out.println(groupBy);
}
package com.lamba;
public class User {
private String name;
private int age;
private String sex;
public User(String name, int age, String sex) {
super();
this.name = name;
this.age = age;
this.sex = sex;
}
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 getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + ", sex=" + sex + "]";
}
}