体验Stream流
案例需求
按照下面的要求完成集合的创建和遍历
创建一个集合,存储多个字符串元素 把集合中所有以"张"开头的元素存储到一个新的集合 把"张"开头的集合中的长度为3的元素存储到一个新的集合 遍历上一步得到的集合
public class MyStream1 {
public static void main ( String [ ] args) {
ArrayList < String > list1 = new ArrayList < > ( List . of ( "张三丰" , "张无忌" , "张翠山" , "王二麻子" , "张良" , "谢广坤" ) ) ;
ArrayList < String > list2 = new ArrayList < > ( ) ;
for ( String s : list1) {
if ( s. startsWith ( "张" ) ) {
list2. add ( s) ;
}
}
ArrayList < String > list3 = new ArrayList < > ( ) ;
for ( String s : list2) {
if ( s. length ( ) == 3 ) {
list3. add ( s) ;
}
}
for ( String s : list3) {
System . out. println ( s) ;
}
}
}
public class StreamDemo {
public static void main ( String [ ] args) {
ArrayList < String > list1 = new ArrayList < > ( List . of ( "张三丰" , "张无忌" , "张翠山" , "王二麻子" , "张良" , "谢广坤" ) ) ;
list1. stream ( ) . filter ( s-> s. startsWith ( "张" ) )
. filter ( s-> s. length ( ) == 3 )
. forEach ( s-> System . out. println ( s) ) ;
}
}
Stream流的常见生成方式
public class StreamDemo {
public static void main ( String [ ] args) {
List < String > list = new ArrayList < String > ( ) ;
Stream < String > listStream = list. stream ( ) ;
Set < String > set = new HashSet < String > ( ) ;
Stream < String > setStream = set. stream ( ) ;
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 ( ) ;
String [ ] strArray = { "hello" , "world" , "java" } ;
Stream < String > strArrayStream = Arrays . stream ( strArray) ;
Stream < String > strArrayStream2 = Stream . of ( "hello" , "world" , "java" ) ;
Stream < Integer > intStream = Stream . of ( 10 , 20 , 30 ) ;
}
}
Stream流中间操作方法
方法名 说明 Stream filter(Predicate predicate) 用于对流中的数据进行过滤 Stream limit(long maxSize) 返回此流中的元素组成的流,截取前指定参数个数的数据 Stream skip(long n) 跳过指定参数个数的数据,返回由该流的剩余元素组成的流 static Stream concat(Stream a, Stream b) 合并a和b两个流为一个流 Stream distinct() 返回由该流的不同元素(根据Object.equals(Object) )组成的流
public class MyStream3 {
public static void main ( String [ ] args) {
ArrayList < String > list = new ArrayList < > ( ) ;
list. add ( "张三丰" ) ;
list. add ( "张无忌" ) ;
list. add ( "张翠山" ) ;
list. add ( "王二麻子" ) ;
list. add ( "张良" ) ;
list. add ( "谢广坤" ) ;
list. stream ( ) . filter ( s -> s. startsWith ( "张" ) ) . forEach ( s-> System . out. println ( s) ) ;
}
}
public class StreamDemo02 {
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 ( ) . limit ( 3 ) . forEach ( s-> System . out. println ( s) ) ;
System . out. println ( "--------" ) ;
list. stream ( ) . skip ( 3 ) . forEach ( s-> System . out. println ( s) ) ;
System . out. println ( "--------" ) ;
list. stream ( ) . skip ( 2 ) . limit ( 2 ) . forEach ( s-> System . out. println ( s) ) ;
}
}
public class StreamDemo03 {
public static void main ( String [ ] args) {
ArrayList < String > list = new ArrayList < String > ( ) ;
list. add ( "林青霞" ) ;
list. add ( "张曼玉" ) ;
list. add ( "王祖贤" ) ;
list. add ( "柳岩" ) ;
list. add ( "张敏" ) ;
list. add ( "张无忌" ) ;
Stream < String > s1 = list. stream ( ) . limit ( 4 ) ;
Stream < String > s2 = list. stream ( ) . skip ( 2 ) ;
Stream . concat ( s1, s2) . distinct ( ) . forEach ( s-> System . out. println ( s) ) ;
}
}
Stream流终结操作方法
方法名 说明 void forEach(Consumer action) 对此流的每个元素执行操作 long count() 返回此流中的元素数
public class MyStream5 {
public static void main ( String [ ] args) {
ArrayList < String > list = new ArrayList < > ( ) ;
list. add ( "张三丰" ) ;
list. add ( "张无忌" ) ;
list. add ( "张翠山" ) ;
list. add ( "王二麻子" ) ;
list. add ( "张良" ) ;
list. add ( "谢广坤" ) ;
long count = list. stream ( ) . count ( ) ;
System . out. println ( count) ;
}
private static void method1 ( ArrayList < String > list) {
list. stream ( ) . forEach (
new Consumer < String > ( ) {
@Override
public void accept ( String s) {
System . out. println ( s) ;
}
}
) ;
System . out. println ( "====================" ) ;
list. stream ( ) . forEach (
( String s) -> {
System . out. println ( s) ;
}
) ;
System . out. println ( "====================" ) ;
list. stream ( ) . forEach ( s-> System . out. println ( s) ) ;
}
}
Stream流的收集操作
方法名 说明 R collect(Collector collector) 把结果收集到集合中
方法名 说明 public static Collector toList() 把元素收集到List集合中 public static Collector toSet() 把元素收集到Set集合中 public static Collector toMap(Function keyMapper,Function valueMapper) 把元素收集到Map集合中
public class MyStream7 {
public static void main ( String [ ] args) {
ArrayList < Integer > list1 = new ArrayList < > ( ) ;
for ( int i = 1 ; i <= 10 ; i++ ) {
list1. add ( i) ;
}
list1. add ( 10 ) ;
list1. add ( 10 ) ;
list1. add ( 10 ) ;
list1. add ( 10 ) ;
list1. add ( 10 ) ;
List < Integer > list = list1. stream ( ) . filter ( number -> number % 2 == 0 )
. collect ( Collectors . toList ( ) ) ;
System . out. println ( list) ;
Set < Integer > set = list1. stream ( ) . filter ( number -> number % 2 == 0 )
. collect ( Collectors . toSet ( ) ) ;
System . out. println ( set) ;
}
}
public class MyStream8 {
public static void main ( String [ ] args) {
ArrayList < String > list = new ArrayList < > ( ) ;
list. add ( "zhangsan,23" ) ;
list. add ( "lisi,24" ) ;
list. add ( "wangwu,25" ) ;
Map < String , Integer > map = list. stream ( ) . filter (
s -> {
String [ ] split = s. split ( "," ) ;
int age = Integer . parseInt ( split[ 1 ] ) ;
return age >= 24 ;
}
) . collect ( Collectors . toMap (
s -> s. split ( "," ) [ 0 ] ,
s -> Integer . parseInt ( s. split ( "," ) [ 1 ] ) ) ) ;
System . out. println ( map) ;
}
}