在java中,list.stream().findFirst().get()与list.get(0)哪个更快?

对比 list.stream().findFirst().get()与list.get(0)

测试代码

public class TestStream {
    public static void main(String[] args) {
        compareGetWithStreamFindFirst();
    }

    private static void compareGetWithStreamFindFirst() {
        int size = 100000;
        System.out.println("findFirst耗时:" + calculateStreamFindFirstTime(size));
        System.out.println("get耗时:" + calculateGetTime(size));
        // get耗时:200-300
        // findFirst耗时:110,000-210,000
    }

    private static long calculateGetTime(int size) {
        ArrayList<User> list = new ArrayList<>();
        for (int i = 0; i < size; i++) {
            list.add(new User("aa" + i, "bb" + i));
        }
        long start = System.nanoTime();
        User user = list.get(0);
        long end = System.nanoTime();
        return end - start;
    }

    private static long calculateStreamFindFirstTime(int size) {
        ArrayList<User> list = new ArrayList<>();
        for (int i = 0; i < size; i++) {
            list.add(new User("cc" + i, "dd" + i));
        }
        long start = System.nanoTime();
        User user = list.stream().findFirst().get();
        long end = System.nanoTime();
        return end - start;
    }
}

User.java实体类:

@Data
public class User {
    private String username;
    private String password;

    public User () {}

    public User (String username, String password) {
        this.username = username;
        this.password = password;
    }
}

结论:经多次测试,list.get(0)比list.stream().findFirst().get()的速度快500倍左右。因为findFirst先将list转换为流,需要消耗时间。但由于两者执行时间都很快,所以没有使用System.currentTimeMillis()而是使用System.nanoTime()来计算时间。在日常使用中可以忽略两种方式的执行效率差别。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
list.stream().filter方法用于对传入的数据流进行过滤处理,只返回满足条件的数据组成的新的数据流。在你提供的代码,filter方法的参数是一个Lambda表达式(i->i>50),表示筛选出大于50的整数。返回的结果是一个新的List,其包含满足条件的元素。所以在你的代码,result列表只包含大于50的元素,即[232]。 与filter方法类似,map方法也是对数据流进行处理的方法。它将传入的数据流的每个元素映射成一个新的元素,并返回一个包含这些新元素的数据流。举个例子,如果你有一个整数列表[1, 2, 3],你可以使用map方法将每个元素都乘以2,得到一个新的列表[2, 4, 6]。 findFirst方法用于返回非空集合的第一个满足条件的元素值。它通常与filter方法结合使用。在你提供的代码,findFirst方法的参数是一个Lambda表达式(i->i>20),表示找到大于20的第一个元素。如果找到了满足条件的元素,则返回Optional类型的结果,你可以使用op.get()获取该元素的值。如果没有找到满足条件的元素,则返回Optional.empty()。 findAny方法与findFirst方法类似,它也是用于在数据流查找满足条件的元素。不同之处在于,findAny方法可以在并行处理的流找到任意一个满足条件的元素,并返回该元素的值。所以在你提供的代码,parallelStream方法将列表转换为并行处理的流,然后使用filter方法筛选出大于20的元素,并使用findAny方法返回第一个满足条件的元素,最后使用get方法获取该元素的值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值