Stream流的使用
生成流
通过数据源(集合,数组等)生成流
list.stream()
中间操作
一个流后面可以跟随零个或多个中间操作,其目的主要是打开流,做出某种程度的数据过滤/映射,然后返回一个新的流,交给下一个操作使用
filter()
终结操作
一个流只能有一一个终结操作,当这个操作执行后,流就被使用"光"了,无法再被操作。所以这必定是流的最后一个操作
forEach()
Stream流的常见生成方式
- Collection体系的集 合可以使用默认方法stream()生成流 default Stream stream()
- Map体系的集合间接的生成流
- 数组可以通过Stream接口的静态方法of… values)生成流
public class StreamDemo {
public static void main(String[] args) {
//Collection体系的集合可以使用stream()生成流
List<String> list = new ArrayList<String>();
Stream<String> listStream = list.stream();
Set<String> set = new HashSet<String>();
Stream<String> setStream = set.stream();
//Map体系的集合间接生成流
Map<String, Integer> map = new HashMap<String, Integer>();
Stream<String> keyStream = map.keySet().stream();//键对应的流
Stream<Integer> valueStream = map.values().stream();//值对应的流
Stream<Map.Entry<String,Integer>> entryStream = map.entrySet().stream();//键值对 对应的流
//数组可以通过Stream接口的静态方法of (T... values)生成流
String[] strArray={"hello","world","java"};
Stream<String > strArrayStream=Stream.of(strArray);
Stream<String> strArrayStream1=Stream.of("hello","world","java");
Stream<Integer> strArrayStream2=Stream.of(10,20,30);
}
}
Stream流操作之Filter使用方法
public class FilterDemo {
public static void main(String[] args) {
ArrayList<String> list=new ArrayList<String>();
list.add("张耿");
list.add("张曼玉");
list.add("张三丰");
list.add("张无忌");
list.add("小龙女");
list.add("尹志平");
//把"张"字开头的元素在控制台输出
list.stream().filter((String s)->{
return s.startsWith("张");
}).forEach(System.out::println);
System.out.println("-------");
//把长度为3的元素输出
list.stream().filter((String s)->{
return s.length()==3;
}).forEach(System.out::println);
System.out.println("--------");
//张开头且长度为3的输出
list.stream().filter((String s)->{
return s.length()==3;
}).filter((String s)->{
return s.startsWith("张");
}).forEach(System.out::println);
}
}
Stream流操作之limit&skip使用方法
public class limitSkipDemo {
public static void main(String[] args) {
ArrayList<String> list=new ArrayList<String>();
list.add("张耿");
list.add("张曼玉");
list.add("张三丰");
list.add("张无忌");
list.add("小龙女");
list.add("尹志平");
//需求1:取前3个数据在控制台输出
list.stream().limit(3).forEach(System.out::println);
System.out.println("-------");
//需求2:跳过3个元素,把剩下的元素在控制台输出
list.stream().skip(3).forEach(System.out::println);
System.out.println("-------");
//需求3:跳过2个元素,把剩下的元素中前2个在控制台输出
list.stream().skip(2).limit(3).forEach(System.out::println);
}
}
### Stream流操作之concat&distinct使用方法
public class concatDistinctDemo {
public static void main(String[] args) {
ArrayList<String> list=new ArrayList<String>();
list.add("张耿");
list.add("张曼玉");
list.add("张三丰");
list.add("张无忌");
list.add("小龙女");
list.add("尹志平");
//需求1:取前4个数据组成一个流
Stream<String> s1=list.stream().limit(4);
//需求2:跳过2个数据组成一个流
Stream<String> s2=list.stream().skip(2);
//需求3:合并需求1和需求2得到的流,并把结果在控制台输出
// Stream.concat(s1,s2).forEach(System.out::println);
System.out.println("-------");
//需求4:合并需求1和需求2得到的流,并把结果在控制台输出,要求字符串元素不能重复
Stream.concat(s1,s2).distinct().forEach(System.out::println);
}
}
### Stream流操作之sort使用方法
public class sortDemo {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("张耿");
list.add("张曼玉");
list.add("张三丰");
list.add("张无忌");
list.add("小龙女");
list.add("尹志平");
// list.stream().sorted().forEach(System.out::println);
list.stream().sorted((s1, s2) -> {
int num = s1.length() - s2.length();
int num2 = num == 0 ? s1.compareTo(s2) : num;//如果长度一样那么就比较首字母的顺序
return num2;
}).forEach(System.out::println);
}
}
### Stream流操作之map使用方法
public class mapDemo {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("11");
list.add("22");
list.add("33");
list.add("44");
list.add("55");
list.add("66");
//需求:将集合中的字符串数据转换为整数之后在控制台输出
// list.stream().map((String s)->{
// return Integer.parseInt(s);
// }).forEach(System.out::println);
int resule = list.stream().mapToInt(Integer::parseInt).sum();
System.out.println(resule);
}
}
### Stream流操作之forEach&count使用方法
- void forEach(Consumer action):对此流的每个元素执行操作
- long count0:返回此流中的元素数
package Stream;
import java.util.ArrayList;
public class forEachCountDemo {
public static void main(String[] args) {
ArrayList<String> list=new ArrayList<String>();
list.add("张耿");
list.add("张曼玉");
list.add("张三丰");
list.add("张无忌");
list.add("小龙女");
list.add("尹志平");
//需求1:把集合中的元素在控制台输出
// list.stream().forEach(System.out::println);
//需求2:统计集合中有几个以张开头的元素,并把统计结果在控制台输出
long count =list.stream().filter((String s)->{
return s.startsWith("张");
}).count();
System.out.println(count);
}
}
package Stream.Practise;
import java.util.ArrayList;
import java.util.stream.Stream;
public class StreamPractice {
public static void main(String[] args) {
ArrayList<String> manlist = new ArrayList<>();
manlist.add("周润发");
manlist.add("刘德华");
manlist.add("大润发");
manlist.add("周发发");
manlist.add("李哈哈");
manlist.add("吴京");
ArrayList<String> womanlist = new ArrayList<>();
womanlist.add("张柏芝");
womanlist.add("张心如");
womanlist.add("张青霞");
womanlist.add("柳岩");
womanlist.add("张志玲");
womanlist.add("王祖贤");
Stream<String> manStream = manlist.stream().filter((String s) -> {
return s.length() == 3;
}).limit(3);
Stream<String> womanStream=womanlist.stream().filter(s->s.startsWith("张"));
Stream<String> compel=Stream.concat(womanStream,manStream);
compel.map(Actor::new).forEach(s-> System.out.println(s.getName()));
}
}
执行结果: