在诺大的江湖中,啊基和啊坝两人游走于其中,啊基感叹自己要多学一些武功,于是啊基告别了啊坝,开始了自己为期两年半的练习…
Stream stream = Stream.of("老虎", "狮子", "熊猫");
stream.forEach(System.out::println);
//输出结果:
老虎
狮子
熊猫
int[] numbers= {1,2,3,4};
IntStream stream= Arrays.stream(numbers);
stream.forEach(System.out::println);
//输出结果:
1
2
3
4
Stream lines=null;
try {
lines=Files.lines(Paths.get("myDog.txt"),Charset.defaultCharset());
lines.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}finally {
lines.close();
}
String[] numbers= {"1","2","3","4"};
List mylist = Arrays.asList(numbers);
mylist.stream().forEach(System.out::println);
//输出结果:
1
2
3
4
设置基础值:
List list = Arrays.asList(
new Animal("老虎",8,150,"北京市"),
new Animal("狮子",5,160,"北京市"),
new Animal("熊猫",13,130,"四川"),
new Animal("金丝猴",23,60,"四川"),
new Animal("长颈鹿",8,260,"天津"),
new Animal("狗",18,90,"上海"));
@Data
public class Animal {
private String name;
private Integer age;
private Integer height;
private String home;
}
list.stream().skip(2).peek(System.out::println)
.map(Animal::getName).limit(3).forEach(System.out::println);
//输出结果:
Animal(name=熊猫, age=13, height=130, home=四川)
熊猫
Animal(name=金丝猴, age=23, height=60, home=四川)
金丝猴
Animal(name=长颈鹿, age=8, height=260, home=天津)
长颈鹿
按照age字段进行排序:
//方式1
list.stream().sorted((d1,d2)->d1.getAge() - d2.getAge()).forEach(System.out::println);
//或者 方式2
list.stream().sorted(Comparator.comparingInt(Animal::getAge)).forEach(System.out::println);
//输出结果:
Animal(name=狮子, age=5, height=160, home=北京市)
Animal(name=老虎, age=8, height=150, home=北京市)
Animal(name=长颈鹿, age=8, height=260, home=天津)
Animal(name=熊猫, age=13, height=130, home=四川)
Animal(name=狗, age=18, height=90, home=上海)
Animal(name=金丝猴, age=23, height=60, home=四川)
distinct():可用于消除流中的重复元素。相比创建一个 Set 集合来消除重复,该方法的工作量要少得多。
filter(Predicate):过滤操作,保留如下元素:若元素传递给过滤函数产生的结
果为 true。
查找age大于2并且去重:
list.stream().filter(u->u.getAge() > 2).map(Animal::getAge).distinct().forEach(System.out::println);
//输出结果:
8
5
13
23
18
获取前两个的name和age :
list.stream().map(Animal::getName).limit(2).forEach(System.out::println);
list.stream().mapToLong(Animal::getAge).limit(2).forEach(System.out::println);
//输出结果:
老虎
狮子
8
5
IntStream age =list.stream().mapToInt(x -> x.getAge());
System.out.println(age.sum());
//输出结果:
75
flatMap() 做了两件事:将产生流的函数应用在每个元素上(与 map() 所做的相
同),然后将每个流都扁平化为元素,因而最终产生的仅仅是元素。
将{"Hello", "World"}进行扁平化,拆分成多个字母:
String[] strings = {"Hello", "World"};
Stream.of(strings)
.map(s -> s.split(""))
.flatMap(s -> Stream.of(s))
.distinct().forEach(System.out::println);
//输出结果:
H
e
l
o
W
r
d
IntStream age = list.stream().mapToInt(x -> x.getAge());
Stream intAge = age.boxed();
System.out.println(intAge);
//输出结果:
java.util.stream.IntPipeline$4@73c6c3b2
IntStream和LongStream的静态方法中可以应用:
在1到20间,查找大于15的值:
IntStream test = IntStream.range(1,20).filter(x -> x> 15);
test.forEach(x->{System.out.print(" "+x);});
//输出结果:
16 17 18 19
在1到10间,查找大于5的值:
IntStream test = IntStream.rangeClosed(1,10).filter(x -> x> 5);
test.forEach(x->{System.out.print(" "+x);});
//输出结果:
6 7 8 9 10
啊基在练习中,发现总有一些空流,他想有没有一个新的武功,可作为流元素
的持有者,即使查看的元素不存在也能友好地提示(也就是说,不会发生异常)?
Optional optional = Optional.ofNullable(list);
System.out.println(optional);
//输出结果:
Optional[[Animal(name=老虎, age=8, height=150, home=北京市), Animal(name=狮子, age=5, height=160, home=北京市), Animal(name=熊猫, age=13, height=130, home=四川), Animal(name=金丝猴, age=23, height=60, home=四川), Animal(name=长颈鹿, age=8, height=260, home=天津), Animal(name=狗, age=18, height=90, home=上海)]]
【Supplier表示结果的提供者,该结果返回一个对象且不接受任何参数,而Consumer表示一个操作,其接受单个输入参数且不返回任何结果】
ifPresent(Consumer)返回列表中第一个元素的name:
Optional optional = Optional.ofNullable(list.get(0));
optional.ifPresent(
x ->
{ System.out.println(x.getName()); }
);
//输出结果:
老虎
• filter(Predicate):对 Optional 中的内容应用 Predicate 并将结果返回。如果
Optional 不满足 Predicate ,将 Optional 转化为空 Optional 。如果 Optional
已经为空,则直接返回空 Optional 。
• map(Function):如果 Optional 不为空,应用 Function 于 Optional 中的内容,
并返回结果。否则直接返回 Optional.empty。
• flatMap(Function):同 map(),但是提供的映射函数将结果包装在 Optional 对
象中,因此 flatMap() 不会在最后进行任何包装。
Optional ww = Optional.ofNullable(list).map(yy ->
{
return yy.get(2).getName();
});
System.out.println("ww值:"+ ww);
//输出结果:
ww值:Optional[熊猫]
终端操作将会获取流的最终结果,至此我们无法再继续往后传递流。可以说,终端
操作总是我们在流管道中所做的最后一件事。
Object[] arr = list.stream().map(m -> m.getName()).toArray();
System.out.println("数组值:"+ JSONObject.toJSONString(arr));
//输出结果:
数组值:["老虎","狮子","熊猫","金丝猴","长颈鹿","狗"]
String[] dd1 = list.stream().map(z -> z.getName()).toArray(String[]::new);
System.out.println("数组值dd1:"+ JSONObject.toJSONString(dd1));
//输出结果:
数组值dd1:["老虎","狮子","熊猫","金丝猴","长颈鹿","狗"]
list.stream().map(z -> z.getName()).forEach(System.out::println);
//输出结果:
老虎
狮子
熊猫
金丝猴
长颈鹿
狗
list.stream().map(z -> z.getName()).forEachOrdered(System.out::println);
//输出结果:
老虎
狮子
熊猫
金丝猴
长颈鹿
狗
可以说是内容最繁多、功能最丰富的部分了。从字面上去理解,就是把一个流收集起来,最终可以是收集成一个值也可以收集成一个新的集合
可以参考:Stream操作时Collectors工具类
也称归约,也称缩减,顾名思义,是把一个流缩减成一个值,能实现对集合求和、求乘积和求最值操作。
详细的reduce()功能可以参考:Stream 流中 Reduce 操作
List numbers=Arrays.asList(2,3,4,8);
int sum=numbers.stream().reduce(0, (a,b)->a+b);
System.out.println("sum="+sum);
//输出结果:
sum=17
• anyMatch(Predicate):如果流的任意一个元素提供给 Predicate 返回 true ,结
果返回为 true。在第一个 true 是停止执行计算。
是否有age>15的值:
if(list.stream().map(Animal::getAge).anyMatch(x -> x> 15)){
System.out.println("有");
}else{
System.out.println("无");
}
//输出结果:
有
是否所有值age>15:
if(list.stream().map(Animal::getAge).allMatch(x -> x> 15)){
System.out.println("有");
}else{
System.out.println("无");
}
//输出结果:
无
• noneMatch(Predicate):如果流的每个元素提供给 Predicate 都返回 false 时,结
果返回为 true。在第一个 true 时停止执行计算。
返回任意一个name:
System.out.println(list.stream().map(Animal::getName).findAny());
//输出结果:
Optional[老虎]
返回第一个name:
System.out.println(list.stream().map(Animal::getName).findFirst());
//输出结果:
Optional[老虎]
• count():流中的元素个数。
• max(Comparator):根据所传入的 Comparator 所决定的 “最大” 元素。
• min(Comparator):根据所传入的 Comparator 所决定的 “最小” 元素。
获取age中的最大值:
int mm = list.stream().map(z -> z.getAge()).max(Integer::compare).get();
System.out.println("mm值:"+ mm);
//输出结果:
mm值:23