目前写的分组函数都是对象中的无参函数,比如Something::getName, Something::getCity之类的,定义的getName和getCity必须都是无参函数,如果想根据某个参数来调整返回值,在stream的groupingBy中调用的Something::getName就会报错(实际参数列表和形式参数列表长度不符)。请教应该处理带有参数的函数,用于分组呢?

解决方案 »

  1.   

    你可以不直接用Something::getName这种方式来获取Function对象,你可以参考下面的代码看下
    public class Test {
    public static void main(String[] args) {

    List<Item> ll = new ArrayList<>(); ll.add(new Item("a", "shanghai"));
    ll.add(new Item("a", "henan"));
    ll.add(new Item("a", "hunan"));
    ll.add(new Item("b", "beijing"));
    ll.add(new Item("b", "tianjin"));
    ll.add(new Item("c", "shanghai"));

    final String prefix = "test.";

    Map<String, List<Item>> map= ll.stream().collect(Collectors.groupingBy(item -> {
    return item.getName(prefix);
    }));

    System.out.println(JSON.toJSONString(map));
    }
    }class Item {

    private String name;
    private String city;

    public Item(String name, String city) {
    super();
    this.name = name;
    this.city = city;
    }
    public String getName(String prefix) {
    return prefix + name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public String getCity() {
    return city;
    }
    public void setCity(String city) {
    this.city = city;
    }
    }结果如下:{
        "test.c":[
            {
                "city":"shanghai"
            }
        ],
        "test.b":[
            {
                "city":"beijing"
            },
            {
                "city":"tianjin"
            }
        ],
        "test.a":[
            {
                "city":"shanghai"
            },
            {
                "city":"henan"
            },
            {
                "city":"hunan"
            }
        ]
    }因为没有name的无参get方法,所以json里面没有该字段