名称 |
说明 |
Stream |
过滤 |
Stream |
获取前几个元素 |
Stream |
跳过前几个元素 |
Stream |
元素去重,依赖(hashCode和equals方法) |
static |
合并a和b两个流为一个流 |
Stream |
转换流中的数据类型 |
import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Predicate;
public class StreamMiddle1 {
public static void main(String[] args) {
// 创建列表并添加元素
ArrayList list = new ArrayList<>();
Collections.addAll(list,"张无忌","周芷若","赵敏","张强","张三丰","张翠山","张良","王二麻子","谢广坤");
// filter 过滤 把"张"开头的留下, 其余数据过滤不要
list.stream().filter(new Predicate() {
@Override
public boolean test(String s) {
// test方法的返回值如果为true,表示当前数据留下
// 如果返回值为false,表示当前数据舍弃不要
boolean result = s.startsWith("张");
return result;
}
}).forEach(s -> System.out.println(s));
System.out.println("++++++++++++++++");
// limit 获取前几个元素
// 打印前三个元素
list.stream().limit(3).forEach(s -> System.out.println(s));
System.out.println("++++++++++++++++");
// skip 跳过几个元素
// 跳过前4个元素
list.stream().skip(4).forEach(s -> System.out.println(s));
System.out.println("++++++++++++++++");
// 打印中间的三个名字
list.stream().limit(6).skip(3).forEach(s -> System.out.println(s));
}
}
import java.util.ArrayList;
import java.util.Collections;
import java.util.stream.Stream;
public class StreamMiddle2 {
public static void main(String[] args) {
/*
* distinct 元素去重,依赖hashCode和equals方法
* concat 合并a和b两个流为一个流
*/
ArrayList list1 = new ArrayList<>();
Collections.addAll(list1,"张无忌","张无忌","张无忌","张强","张三丰","张翠山","张良","王二麻子","谢广坤");
ArrayList list2 = new ArrayList<>();
Collections.addAll(list2,"周芷若","赵敏");
// 去重
list1.stream().distinct().forEach(s -> System.out.println(s));
System.out.println("+++++++++++++++");
// 合并2个流,使用Stream.concat方法
Stream.concat(list1.stream(), list2.stream()).forEach(s -> System.out.println(s));
}
}
import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Function;
public class StreamMiddle3 {
public static void main(String[] args) {
/*
map
转换流中的数据类型
注意1:中间方法,返回新的Stream流,原来的Stream流只能使用一次,建议使用链式编程
注意2:修改Stream流中的数据,不会影响原来集合或者数组中的数据
*/
ArrayList list =new ArrayList<>();
Collections.addAll(list,"张无忌-15","周芷若-14","赵敏-13","张强-20","张三丰-100","张翠山-40","张良-35","王二麻子-37");
//只获取里面的年龄并进行打印
//String->int
//第一个类型:流中原本的数据类型
//第二个类型:要转成之后的类型
//apply的形参s:依次表示流里面的每一个数据
//返回值:表示转换之后的数据
list.stream().map(new Function() {
@Override
public Integer apply(String s) {
String[] arr = s.split("-");
String ageString = arr[1];
int age = Integer.parseInt(ageString);
return age;
}
}).forEach(s -> System.out.println(s));
// 上面方法体可以改成lambda表达式形式,如下:
list.stream()
.map(s -> Integer.parseInt(s.split("-")[1]))
.forEach(s -> System.out.println(s));
}
}
名称 |
说明 |
void forEach(Consumer action) |
遍历 |
long count() |
统计 |
toArray() |
收集流中的数据,放到数组中 |
collect(Collector collector) |
收集流中的数据,放到集合中 |
示例代码如下:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.function.Consumer;
import java.util.function.IntFunction;
public class StreamDemo9 {
public static void main(String[] args) {
/*
void forEach(Consumer action) 遍历
long count() 统计
toArray() 收集流中的数据,放到数组中
*/
// 创建数组
ArrayList list =new ArrayList<>();
// 添加元素
Collections.addAll(list,"张无忌","周芷若","赵敏","张强","张三丰","张翠山","张良","王二麻子","谢广坤");
// 遍历
list.stream().forEach(new Consumer() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
System.out.println("++++++++++++++");
// 统计
long count = list.stream().count();
System.out.println(count);
System.out.println("++++++++++++++");
// toArray数组:收集流中的数据,放到数组中
//
/*
Object[] array = list.stream().toArray();
System.out.println(array);
for (Object o : array) {
System.out.println(o);
}
*/
// IntFunction的泛型: 具体类型的数组
// apply的形参:流中数据的个数,要跟数组的长度保持一致,把Object改成String
// apply的返回值:具体类型的数组
// 方法体:创建数组
/*
String[] arr = list.stream().toArray(new IntFunction() {
@Override
public String[] apply(int value) {
return new String[value];
}
});
System.out.println(Arrays.toString(arr));
*/
// 或者也可以简写,如下:
String[] arr2 = list.stream().toArray(value -> new String[value]);
System.out.println(Arrays.toString(arr2));
}
}