JDK8中stream处理数据常用例子

处理List数据的时候往往需要通过一个for循环或者while 循环。
在JDK8中引入了Stream,通过stream,可以便捷地处理List,并且减少比较多模版式的代码,在Stream中也可以使用lambda表达式。

上demo

先定义一个简单的实体类

	public class TestBean {
   
        private Integer id;;
        private String name;
        private Integer score;

        public TestBean(int id, String name, Integer score) {
   
            this.id = id;
            this.name = name;
            this.score = score;
        }

        public Integer getId() {
   
            return id;
        }

        public void setId(Integer id) {
   
            this.id = id;
        }

        public String getName() {
   
            return name;
        }

        public void setName(String name) {
   
            this.name = name;
        }

        public Integer getScore() {
   
            return score;
        }

        public void setScore(Integer score) {
   
            this.score = score;
        }

        @Override
        public String toString() {
   
            return "{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", score=" + score +
                    "} ";
        }
    }

做一个初始化方法

private List<TestBean> buildList() {
   
    TestBean testBean0 = new TestBean(0, "name0", 0);
    TestBean testBean1 = new TestBean(1, "name1", 10);
    TestBean testBean2 = new TestBean(2, "name2", 20);
    TestBean testBean3 = new TestBean(3, "name3", 30);
    TestBean testBean4 = new TestBean(4, "name4", 40);
    TestBean testBean5 = new TestBean(5, "name5", 50);
    TestBean testBean6 = new TestBean(6, "name6", 60);
    TestBean testBean7 = new TestBean(7, "name7", 70);
    TestBean testBean8 = new TestBean(8, "name8", 80);
    TestBean testBean9 = new TestBean(9, "name9", 90);
    ArrayList<TestBean> arrayList = new ArrayList<>();
    arrayList.add(testBean0);
    arrayList.add(testBean1);
    arrayList.add(testBean2);
    arrayList.add(testBean3);
    arrayList.add(testBean4);
    arrayList.add(testBean5);
    arrayList.add(testBean6);
    arrayList.add(testBean7);
    arrayList.add(testBean8);
    arrayList.add(testBean9);
    return arrayList;
}

max

取最大值,这个最大值取决于比较的方式

TestBean maxTestBean = list.stream().max(Comparator.comparingInt(TestBean::getScore)).get();
System.out.println(maxTestBean);

输出

{
   id=9, name='name9', score=90}

min

取最小值,最小值也是取决于比较的方式

TestBean minTestBean = list.stream().min(Comparator.comparingInt(TestBean::getScore)).get();
System.out.println(minTestBean);

输出

{
   id=0, name='name0', score=0} 

forEach

类似于for 循环,遍历每一个元素。

举个最简单的例子,循环输出逻辑

//简单foreach输出
list.stream().forEach(testBean -> {
   
    System.out.print(testBean);
});
//简化输出方法
list.stream().forEach(System.out::print);
//再简化 这个好像已经不是stream 但这不重要
list.forEach(System.out::print);

以上代码的输出都是

{
   id=0, name='name0', score=0} {
   id=1, name='name1', score=10} {
   id=2, name='name2', score=20} {
   id=3, name='name3', score=30} {
   id=4, name='name4', score=40} {
   id=5, name='name5', score=50} {
   id=6, name='name6', score=60} {
   id=7, name='name7', score=70} {
   id=8, name='name8', score=80} {
   id=9, name='name9', score=90}

修改分数

 //修改score 每个的 score + 10
 list.stream().forEach(element -> {
   
    element.setScore(element.getScore() + 10);
});
list.forEach(System.out::print);

输出为

{
   id=0, name='name0', score=10} {
   id=1, name='name1', score=20} {
   id=2, name='name2', score=30} {
   id=3
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
JDK8,引入了Stream API,这个API提供了一种更加简洁,高效的方式来处理数据的流式操作,Stream API支持对数据流进行过滤、映射、排序、聚合等多种操作。对于双重循环的情况,JDK8的Stream提供了三种方式:flatMap、forEach和reduce。 1. flatMap:flatMap操作可以将一个Stream的每个元素转换成另一个Stream,然后将所有Stream合并成一个。在处理双重循环的情况下,我们可以使用flatMap将两个Stream合并成一个,然后对结果进行处理。示例代码如下: ``` List<Integer> list1 = Arrays.asList(1, 2, 3); List<Integer> list2 = Arrays.asList(3, 4); List<int[]> result = list1.stream() .flatMap(i -> list2.stream() .map(j -> new int[]{i, j})) .collect(Collectors.toList()); result.forEach(arr -> System.out.println(Arrays.toString(arr))); ``` 2. forEach:forEach操作可以对Stream的每个元素执行指定的操作。我们可以在forEach嵌套一层循环来处理双重循环的情况。示例代码如下: ``` List<Integer> list1 = Arrays.asList(1, 2, 3); List<Integer> list2 = Arrays.asList(3, 4); list1.forEach(i -> { list2.forEach(j -> { int[] arr = new int[]{i, j}; System.out.println(Arrays.toString(arr)); }); }); ``` 3. reduce:reduce操作可以将Stream的元素通过指定的操作进行合并,返回一个Optional类型的结果。我们可以在reduce嵌套一层循环来处理双重循环的情况。示例代码如下: ``` List<Integer> list1 = Arrays.asList(1, 2, 3); List<Integer> list2 = Arrays.asList(3, 4); List<int[]> result = list1.stream() .reduce(new ArrayList<>(), (acc, i) -> { list2.forEach(j -> acc.add(new int[]{i, j})); return acc; }, (l1, l2) -> {l1.addAll(l2); return l1;}); result.forEach(arr -> System.out.println(Arrays.toString(arr))); ``` 总之,在JDK8处理双重循环可以使用flatMap、forEach和reduce等操作来实现,这些操作让Java代码变得更加简洁、高效、易于理解。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值