Java 8 中的stream分组函数能否带参数呢

zheyimiao 2019-01-24 01:40:37
目前写的分组函数都是对象中的无参函数,比如Something::getName, Something::getCity之类的,定义的getName和getCity必须都是无参函数,如果想根据某个参数来调整返回值,在stream的groupingBy中调用的Something::getName就会报错(实际参数列表和形式参数列表长度不符)。请教应该处理带有参数的函数,用于分组呢?
...全文
860 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
飘落的秋风 2019-02-13
  • 打赏
  • 举报
回复
你可以不直接用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里面没有该字段
资源下载链接为: https://pan.quark.cn/s/9e7ef05254f8 Java 8的Stream API引入了一种新的编程范式,允许我们以声明式的方式处理数据。其,reduce()方法是Stream API的重要组成部分,它能够将流的元素组合起来,最终生成一个单一的结果。对于List的分组统计操作,reduce()方法的三个参数版本非常有用。reduce()方法的签名如下: identity:这是初始值,作为累加操作的起点。在分组统计的场景下,它通常是空的Map或者List,这取决于你想要聚合的数据结构。 accumulator:这是一个二元函数,用于将当前累加值U与流的下一个元素T组合。在分组统计,它能够将新元素添加到现有的分组。 combiner:这是另一个二元函数,用于处理并合并两个累加结果,确保在并行处理时不会丢失信息。 例如,假设我们有一个包含以下对象的List: 我们的目标是将其按"name"分组,并计算每个分组的"typeValue"总和以及"type"的列表。这可以通过以下方式实现: 这里,Foo是源数据的类,Bar是聚合后的类,包含分组的名称、总计数、typeValue总和以及一个包含所有type的列表bazList。Baz类则表示单个type的信息。在上述代码,accumulator函数负责将每个Foo对象添加到Bar对象,而combiner函数则用于合并两个Bar对象,确保在并行处理时能够正确地组合结果。 最终,我们得到了一个新的Map,其键是"name",值是对应的Bar对象,满足了我们的需求:

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧