java8:函数式Map操作

java8:函数式Map操作

1.介绍

list、map的转换变形,业务代码中经常遇到,传统模式需要写一堆代码for循环一个个逻辑判断,麻烦且易出bug。下面看下java8的函数式代码。

package com.base3;

import java.math.BigDecimal;
import java.math.BigInteger;

public class Fruit {
    private String name;
    private BigDecimal price;
    private BigInteger number;
    private int total;
    private double RealPrice;

    public Fruit(String name, BigDecimal price, BigInteger number, int total, double realPrice) {
        this.name = name;
        this.price = price;
        this.number = number;
        this.total = total;
        RealPrice = realPrice;
    }

    @Override
    public String toString() {
        return "Fruit{" +
                "name='" + name + '\'' +
                ", price=" + price +
                ", number=" + number +
                ", total=" + total +
                ", RealPrice=" + RealPrice +
                '}';
    }

    public void setPrice(BigDecimal price) {
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public BigDecimal getPrice() {
        return price;
    }

    public BigInteger getNumber() {
        return number;
    }

    public int getTotal() {
        return total;
    }

    public double getRealPrice() {
        return RealPrice;
    }
}

tips: https://search.maven.org/ 可以查看库的各个版本,比如fastjson
在这里插入图片描述
在maven项目的pom.xml中引入该库(包):

<dependencies>
	<dependency>
	    <groupId>com.alibaba</groupId>
	    <artifactId>fastjson</artifactId>
	    <version>1.2.78</version>
	</dependency>
</dependencies>

在这里插入图片描述
在这里插入图片描述
安装完即可使用fastjson:
在这里插入图片描述
在这里插入图片描述
由路径可知,导入com.alibaba.fastjson.JSON即可

testng下包含Lists,可以使用Lists.newArrayList,依赖如下:

<dependency>
    <groupId>org.testng</groupId>
    <artifactId>testng</artifactId>
    <version>6.14.3</version>
    <scope>compile</scope>
</dependency>

2 list转map

import com.alibaba.fastjson.serializer.SerializerFeature;
import org.testng.collections.Lists;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;
import java.util.stream.Collectors;
import com.alibaba.fastjson.JSON;
List<Fruit> fr= Lists.newArrayList(
        new Fruit("apple",new BigDecimal("2"),new BigInteger("15"),40,1.23),
        new Fruit("watermelon",new BigDecimal("4"),new BigInteger("5"),10,0.6),
        new Fruit("peach",new BigDecimal("2"),new BigInteger("5"),20,1.8),
        new Fruit("pear",new BigDecimal("4"),new BigInteger("15"),15,3.2),
        new Fruit("banana",new BigDecimal("3"),new BigInteger("15"),24,2)
);

//list转map
Map<String,Fruit> m=Optional.ofNullable(fr).orElse(Collections.emptyList())
        .stream().collect(Collectors.toMap(Fruit::getName,x->x));
System.out.println(JSON.toJSONString(m, SerializerFeature.PrettyFormat,SerializerFeature.WriteMapNullValue,SerializerFeature.WriteDateUseDateFormat));
{
	"banana":{
		"name":"banana",
		"number":15,
		"price":3,
		"realPrice":2.0,
		"total":24
	},
	"apple":{
		"name":"apple",
		"number":15,
		"price":2,
		"realPrice":1.23,
		"total":40
	},
	"pear":{
		"name":"pear",
		"number":15,
		"price":4,
		"realPrice":3.2,
		"total":15
	},
	"peach":{
		"name":"peach",
		"number":5,
		"price":2,
		"realPrice":1.8,
		"total":20
	},
	"watermelon":{
		"name":"watermelon",
		"number":5,
		"price":4,
		"realPrice":0.6,
		"total":10
	}
}

2.1 key,value格式

Map<String,BigDecimal> m=Optional.ofNullable(fr).orElse(Collections.emptyList())
        .stream().collect(Collectors.toMap(Fruit::getName,Fruit::getPrice));
System.out.println(JSON.toJSONString(m, SerializerFeature.PrettyFormat,SerializerFeature.WriteMapNullValue,SerializerFeature.WriteDateUseDateFormat));
{
	"banana":3,
	"apple":2,
	"pear":4,
	"peach":2,
	"watermelon":4
}

toMap在含重复key时会抛错duplicate key,可如下处理:

Map<BigInteger,BigDecimal> m=Optional.ofNullable(fr).orElse(Collections.emptyList())
        .stream().collect(Collectors.toMap(Fruit::getNumber,Fruit::getPrice,(key1,key2)->key1));
System.out.println(JSON.toJSONString(m, SerializerFeature.PrettyFormat,SerializerFeature.WriteMapNullValue,SerializerFeature.WriteDateUseDateFormat));

在这里插入图片描述

{5:4,15:2
}

2.2 list转map然后分组

根据BigInteger的编号对水果进行分组:

Map<BigInteger,List<Fruit>> m=Optional.ofNullable(fr).orElse(Collections.emptyList())
        .stream().collect(Collectors.groupingBy(Fruit::getNumber));
System.out.println(JSON.toJSONString(m,SerializerFeature.PrettyFormat,SerializerFeature.WriteMapNullValue));
{5:[
		{
			"name":"watermelon",
			"number":5,
			"price":4,
			"realPrice":0.6,
			"total":10
		},
		{
			"name":"peach",
			"number":5,
			"price":2,
			"realPrice":1.8,
			"total":20
		}
	],15:[
		{
			"name":"apple",
			"number":15,
			"price":2,
			"realPrice":1.23,
			"total":40
		},
		{
			"name":"pear",
			"number":15,
			"price":4,
			"realPrice":3.2,
			"total":15
		},
		{
			"name":"banana",
			"number":15,
			"price":3,
			"realPrice":2.0,
			"total":24
		}
	]
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值