Stream(流)是一个支持顺序和平行聚合操作的元素序列,和java.util.List类似,是jdk1.8的新特性。可以看出Stream还有几个兄弟类IntStream、LongStream和DoubleStream。
/** * @paramthe type of the stream elements * @since 1.8 * @see IntStream * @see LongStream * @see DoubleStream * @see java.util.stream */ public interface Stream extends BaseStream > { ...... }
本章主要以集合流来介绍Stream的详细使用
目录
一、实例方法
操作类方法
转换类方法
遍历类方法
获取类方法
判断类方法
二、静态方法
1、Stream
过滤掉流中不符合断言规则的元素,得到一个新的Stream对象
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class StreamExample {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("Hello");
list.add("Tom");
list.add("Marry");
list.add("Jhon");
list.add("Lisa");
list.add("Jim");
list.add("Jackson");
list.add("Jackson");
list.add("Jackson");
Stream stream = list.stream();
Stream stringStream = stream.filter(new Predicate() {
@Override
public boolean test(String s) {
return s.contains("o");
}
});
System.out.println(
Arrays.toString(
stringStream.toArray()
)
);
}
}
以上代码的作用是输出集合list中包含字符串"o"的元素。
运行结果:
[Hello, Tom, Jhon, Jackson, Jackson, Jackson]
2、Stream
去重
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class StreamExample {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("Hello");
list.add("Tom");
list.add("Marry");
list.add("Jhon");
list.add("Lisa");
list.add("Jim");
list.add("Jackson");
list.add("Jackson");
list.add("Jackson");
Stream stream = list.stream();
System.out.println(
Arrays.toString(
stream.distinct().toArray()
)
);
}
}
去重后,只有一个Jackson
[Hello, Tom, Marry, Jhon, Lisa, Jim, Jackson]
3、Stream
对流的元素排序,如果是字母,按照字母的顺序从a~z、A~Z排序
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class StreamExample {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("Hello");
list.add("Tom");
list.add("Marry");
list.add("Jhon");
list.add("Lisa");
list.add("Jim");
list.add("Jackson");
list.add("Jackson");
list.add("Jackson");
Stream stream = list.stream();
System.out.println(
Arrays.toString(
stream.sorted().toArray()
)
);
}
}
排序后,打印结果为
[Hello, Jackson, Jackson, Jackson, Jhon, Jim, Lisa, Marry, Tom]
4、Stream
排序,并自定义排序规则,Comparator应该都不陌生——比较器接口,在集合的排序方法Collections.sort()中就用到了
如:按照字符串长度排序
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Stream;
public class StreamExample {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("Hello");
list.add("Tom");
list.add("Marry");
list.add("Jhon");
list.add("Lisa");
list.add("Jim");
list.add("Jackson");
list.add("Jackson");
list.add("Jackson");
Stream stream = list.stream();
System.out.println(
Arrays.toString(
stream.sorted(new Comparator() {
@Override
public int compare(String o1, String o2) {
return o1.length() - o2.length();
}
}).toArray()
)
);
}
}
长度相同的按照原有的先后顺序排序,运行结果如下
[Tom, Jim, Jhon, Lisa, Hello, Marry, Jackson, Jackson, Jackson]
5、Stream
元素遍历,这里有涉及到了Consumer函数这个接口,和Function接口的功能几乎一样
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.stream.Stream;
public class StreamExample {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("Hello");
list.add("Tom");
list.add("Marry");
list.add("Jhon");
list.add("Lisa");
list.add("Jim");
list.add("Jackson");
list.add("Jackson");
list.add("Jackson");
Stream stream = list.stream();
stream.peek(new Consumer() {
@Override
public void accept(String s) {
System.out.println(s.toLowerCase());
}
}).toArray();
}
}
以上代码把元素全部转为小写字母然后打印
hello
tom
marry
jhon
lisa
jim
jackson
jackson
jackson
6、Stream
修改Stream中元素的个数
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class StreamExample {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("Hello");
list.add("Tom");
list.add("Marry");
list.add("Jhon");
list.add("Lisa");
list.add("Jim");
list.add("Jackson");
list.add("Jackson");
list.add("Jackson");
Stream stream = list.stream();
System.out.println(
Arrays.toString(
stream.limit(5).toArray()
)
);
}
}
最后只保留了前5个元素,运行结果如下
[Hello, Tom, Marry, Jhon, Lisa]
7、Stream
跳过前n个元素,也就是删除前n个元素
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class StreamExample {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("Hello");
list.add("Tom");
list.add("Marry");
list.add("Jhon");
list.add("Lisa");
list.add("Jim");
list.add("Jackson");
list.add("Jackson");
list.add("Jackson");
Stream stream = list.stream();
System.out.println(
Arrays.toString(
stream.skip(5).toArray()
)
);
}
}
跳过了前五个元素,就只剩下最后四个元素
[Jim, Jackson, Jackson, Jackson]
1、
用于转化流的类型,得到的Stream对象类型为R,也就是Function的返回值类型
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Stream;
public class StreamExample {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("Hello");
list.add("Tom");
list.add("Marry");
list.add("Jhon");
list.add("Lisa");
list.add("Jim");
list.add("Jackson");
list.add("Jackson");
list.add("Jackson");
Stream stream = list.stream();
Stream booleanStream = stream.map(new Function() {
@Override
public Boolean apply(String s) {
return s.equals("Hello");
}
});
System.out.println(
Arrays.toString(
booleanStream.toArray()
)
);
}
}
显然,只有第一个元素为true,其他都是false
[true, false, false, false, false, false, false, false, false]
2、IntStream mapToInt(ToIntFunction super T> mapper);
转为IntStream 对象
3、LongStream mapToLong(ToLongFunction super T> mapper);
转为LongStream 对象
4、DoubleStream mapToDouble(ToDoubleFunction super T> mapper);
转为DoubleStream 对象
5、
批量操作流中的所有元素,得到一个新的流对象
6、IntStream flatMapToInt(Function super T, ? extends IntStream> mapper);
作用同mapToInt()
7、LongStream flatMapToLong(Function super T, ? extends LongStream> mapper);
作用同mapToLong()
8、DoubleStream flatMapToDouble(Function super T, ? extends DoubleStream> mapper);
作用同mapToDouble()
9、Object[] toArray();
使用当前Stream对象的所有元素生成一个数组,整篇文章基本都在使用这个方法,就不过多介绍了。
10、 A[] toArray(IntFunction generator);
作用和上一个方法一样,参数类型A要求是当前Stream对象的泛型的超类,否则会抛出
ArrayStoreException异常,下面的代码将得到包含Stream对象里所以元素的数组并遍历打印
import java.util.ArrayList;
import java.util.List;
import java.util.function.IntFunction;
import java.util.stream.Stream;
public class StreamExample {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("Hello");
list.add("Tom");
list.add("Marry");
list.add("Jhon");
list.add("Lisa");
list.add("Jim");
list.add("Jackson");
list.add("Jackson");
list.add("Jackson");
Stream stream = list.stream();
String[] array = stream.toArray(new IntFunction() {
@Override
public String[] apply(int value) {
return new String[list.size()];
}
});
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
}
11、Optional
对当前Stream对象的所有元素执行一定操作,得到一个Optional对象,操作的结果就是Optional对象的value值。不熟悉Optional的童鞋请移步java.util.Optional详解
例如,把Stream对象的元素拼接起来得到一个Optinal对象
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.function.BinaryOperator;
import java.util.stream.Stream;
public class StreamExample {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("Hello");
list.add("Tom");
list.add("Marry");
list.add("Jhon");
list.add("Lisa");
list.add("Jim");
list.add("Jackson");
list.add("Jackson");
list.add("Jackson");
Stream stream = list.stream();
Optional optional = stream.reduce(new BinaryOperator() {
@Override
public String apply(String s, String s2) {
return s.concat(s2);
}
});
System.out.println(optional.get());
}
}
运行结果
HelloTomMarryJhonLisaJimJacksonJacksonJackson
12、T reduce(T identity, BinaryOperator
该方法作用和上一个方法一样,但是可以指定返回值类型,返回值类型就是第一个参数的类型
import java.util.ArrayList;
import java.util.List;
import java.util.function.BinaryOperator;
import java.util.stream.Stream;
public class StreamExample {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("Hello");
list.add("Tom");
list.add("Marry");
list.add("Jhon");
list.add("Lisa");
list.add("Jim");
list.add("Jackson");
list.add("Jackson");
list.add("Jackson");
Stream stream = list.stream();
String result = stream.reduce("", new BinaryOperator() {
@Override
public String apply(String s, String s2) {
return s.concat(s2);
}
});
System.out.println(result);
}
}
运行结果和上一个方法一样,都是把Stream对象的所有元素拼接起来
HelloTomMarryJhonLisaJimJacksonJacksonJackson
13、 U reduce(U identity, BiFunction accumulator, BinaryOperator combiner);
14、
15、
1、void forEach(Consumer super T> action);
很明显,这个方法就是用来遍历当前Stream对象里的元素
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.stream.Stream;
public class StreamExample {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("Hello");
list.add("Tom");
list.add("Marry");
list.add("Jhon");
list.add("Lisa");
list.add("Jim");
list.add("Jackson");
list.add("Jackson");
list.add("Jackson");
Stream stream = list.stream();
stream.forEach(new Consumer() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
}
}
直接打印所有的元素
Hello Tom Marry Jhon Lisa Jim Jackson Jackson Jackson
2、void forEachOrdered(Consumer super T> action);
按正序遍历元素,同forEach()
package test;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.stream.Stream;
public class StreamExample {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("Hello");
list.add("Tom");
list.add("Marry");
list.add("Jhon");
list.add("Lisa");
list.add("Jim");
list.add("Jackson");
list.add("Jackson");
list.add("Jackson");
Stream stream = list.stream();
stream.forEachOrdered(new Consumer() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
}
}
运行结果和上一个方法一样
1、Optional
获取当前Stream对象中元素的最小值
2、Optional
获取当前Stream对象中元素的最大值
3、long count();
获取当前Stream对象中元素的个数,用法很简单,就不贴代码了
4、Optional
得到一个包含当前Stream对象的第一个元素的Optinal对象
5、Optional
得到一个包含当前Stream对象的任意一个元素的Optinal对象
1、boolean anyMatch(Predicate super T> predicate);
判断当前Stream对象的元素中有没有元素符合断言,如果有,则返回true,否则返回false
2、boolean allMatch(Predicate super T> predicate);
判断当前Stream对象的元素是否全部符合断言,如果是,返回true,否则返回false
3、boolean noneMatch(Predicate super T> predicate);
该方法和anyMatch()相反,没有元素符合断言返回true,否则返回false
1、static
返回一个空的顺序流
2、static
指定元素创建一个顺序流
3、static
通过指定的多个元素创建一个顺序流