阿里二面:java8的stream api是迭代一次还是迭代多次

在面试中,讨论了Java8 Stream API的迭代次数,指出filter操作是无状态的,只迭代一次。解释了无状态和有状态操作的区别,并通过代码示例展示了有状态操作可能需要多次迭代。还探讨了Stream的底层实现,包括Sink接口、短路操作、并行处理和Fork/Join框架,以及如何考虑性能因素来选择使用Stream API。
摘要由CSDN通过智能技术生成

面试官:java8新增的stream api用过吗?
:这个必须用过啊。

面试官:给你下面一个字符串数组,如果用stream api来实现,找出以字符'a'开头长度最大的字符串,使用stream api该怎么实现呢?

{"abb","abcd","fegc","efe","adfes"}

:用下面这个方法来实现:

public static void maxLength(List<String> list){
    System.out.println(list.stream().filter(s -> s.startsWith("a")).mapToInt(r -> length(r)).max().orElse(0));;
}

面试官:这个操作是迭代一次还是迭代两次呢?也就是说是先迭代一遍,过滤出以字符'a'开头的字符串数组,然后再迭代一次,找出最大长度,还是一次迭代完成呢?
:这个是迭代一次完成,如果要是迭代多次,stream后面的操作函数很多的情况下效率会非常低。我们加个打印可以来验证结果,代码如下:

public static void main(String[] args) {
    List<String> list = Arrays.asList("abb", "abcd", "fegc", "efe", "adfes");
    int maxLength = list.stream().
          filter(s -> isStartWitha(s)).
    mapToInt(StreamTest1::length).
    max().orElse(0);
    System.out.println("以字符a开头的字符串最大长度:" + maxLength);
}

private static boolean isStartWitha(String a){
    System.out.println(a + " is start with a:" + a.startsWith("a"));
    return a.startsWith("a");
}

private static int length(String a){
    System.out.println("the length of" + a + ":" + a.length());
    return a.length();
}

打印结果如下:

abb is start with a:true
the length of abb:3
abcd is start with a:true
the length of abcd:4
fegc is start with a:false
efe is start with a:false
adfes is start with a:true
the length of adfes:5
以字符a开头的字符串最大长度:5

面试官:你确定只是迭代一次吗?有其他情况吗?
:有。filter是一个无状态的中间操作,对于这个中间操作来说,stream处理只需要迭代一次。但是对于有状态的中间操作,就需要迭代多次。

面试官

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值