java8分组几种用法的简单介绍

博主:adminadmin 2023-01-04 20:15:06 1123

本篇文章给大家谈谈java8分组几种用法,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

Java 对数据分组

把从数据库读出来的ResultSet 传入这个方法

public static MapLong, ListLong orgnaizeData(ResultSet rs) {

MapLong, ListLong result = null;

try {

if (rs.getRow() 0) {

result = new HashMapLong, ListLong();

while (rs.next()) {

Long key = rs.getLong(1);

Long value = rs.getLong(2);

if (result.containsKey(key)) {

result.get(key).add(value);

} else {

ListLong valueList = new ArrayListLong();

valueList.add(value);

result.put(key, valueList);

}

}

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return result;

}

groupby java

groupby java是什么,让我们一起了解一下?

groupby的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理,groupby核心用法是利用本身的某一列或多列内容进行分组聚合。

groupby的核心用法:

(1)根据DataFrame本身的某一列或多列内容进行分组聚合,(a)若按某一列聚合,则新DataFrame将根据某一列的内容分为不同的维度进行拆解,同时将同一维度的再进行聚合,(b)若按某多列聚合,则新DataFrame将是多列之间维度的笛卡尔积,即:新DataFrame具有一个层次化索引(由唯一的键对组成),例如:“key1”列,有a和b两个维度,而“key2”有one和two两个维度,则按“key1”列和“key2”聚合之后,新DataFrame将有四个group;

注意:groupby默认是在axis=0上进行分组的,通过设置axis=1,也可以在其他任何轴上进行分组。

(2)groupby,根据分组键的不同,有以下4种聚合方法:

1、分组键为Series。

(a)使用原df的子列作为Series。

df.groupby([ df[‘key1’], df[‘key2’] ]).mean()

(b)使用自定义的Series。

mapping={‘a’:‘red’,‘b’:‘red’,‘c’:‘blue’,‘d’:‘blue’,‘e’:‘red’,‘f’:‘orange’}

map_series=pd.Series(mapping)

people.groupby(map_series,axis=1).count()

2、分组键为列名。

df.groupby([ ‘key1’,‘key2’ ]).mean()

3、分组键为数组。

states=np.array([‘Ohio’, ‘California’, ‘California’, ‘Ohio’, ‘Ohio’])

years=np.array([2004,2005,2006,2005,2006]) #自定义数组

df[‘data1’].groupby( [ states,years ] ).mean()

4、分组键为字典。

mapping={‘a’:‘red’,‘b’:‘red’,‘c’:‘blue’,‘d’:‘blue’,‘e’:‘red’,‘f’:‘orange’} #自定义字典。

by_column=people.groupby(mapping,axis=1).sum() #指定axis=1,表示对列数据进行聚合分组。

5、分组键为函数。

例如:传入len函数(可以求取一个字符串长度数组),实现根据字符串的长度进行分组。

people.groupby(len).sum() #将字符串长度相同的行进行求和。

5、分组键为函数和数组、列表、字典、Series的组合。

引入列表list[ ] 将函数跟数组、列表、字典、Series混合使用作为分组键进行聚合,因为任何东西最终都会被转换为数组。

key_list=[‘one’,‘one’,‘one’,‘two’,‘two’] #自定义列表,默认列表顺序和df的列顺序一致。

people.groupby([ len,key_list ]).min()

6、分组键为具有多重列索引df 的列索引层次。

hier_df.groupby(level=‘cty’,axis=1).count() #利用参数level,指明聚合的层级。

代码示例说明:

将多个字段拼接成一个新字段,在使用Java8的groupBy进行分组。 Map detailmap = details.stream() .collect(Collectors.groupingBy(d - fetchGroupKey(d) )); private String fetchGroupKey(EntryDeliveryDetailywk detail){         return detail.getSkuId().toString()          + detail.getItemsName()          + detail.getWarehouseId().toString()            + detail.getSupplierId().toString();     }

Java8 Stream中小弟我怎么对多个字段分组

在介绍Java 8的流(Stream)时,我们学会了一些集合操作的实用技巧。现在我们要看看怎样把这些循环转换为更简洁,可读性更高的代码。

开始编码!

好吧,讲的够多了,是时候展示一些例子了!

这次我们要以文章为例子。一篇文章拥有一个标题,一个作者和几个标签。

private class Article {

private final String title;

private final String author;

private final ListString tags;

private Article(String title, String author, ListString tags) {

this.title = title;

this.author = author;

this.tags = tags;

}

public String getTitle() {

return title;

}

public String getAuthor() {

return author;

}

public ListString getTags() {

return tags;

}

}

每个例子都会包含一个使用传统循环的方案和一个使用Java 8新特性的方案。

在第一个例子里,我们要在集合中查找包含“Java”标签的第一篇文章。

看一下使用for循环的解决方案。

public Article getFirstJavaArticle() {

for (Article article : articles) {

if (article.getTags().contains("Java")) {

return article;

}

}

return null;

}

现在我们使用Stream API的相关操作来解决这个问题。

public OptionalArticle getFirstJavaArticle() {

return articles.stream()

.filter(article - article.getTags().contains("Java"))

.findFirst();

}

是不是很酷?我们首先使用 filter 操作去找到所有包含Java标签的文章,然后使用 findFirst()

操作去获取第一次出现的文章。因为Stream是“延迟计算”(lazy)的并且filter返回一个流对象,所以这个方法仅在找到第一个匹配元素时才会

处理元素。

现在,让我们获取所有匹配的元素而不是仅获取第一个。

首先使用for循环方案。

public ListArticle getAllJavaArticles() {

ListArticle result = new ArrayList();

for (Article article : articles) {

if (article.getTags().contains("Java")) {

result.add(article);

}

}

return result;

}

使用Stream操作的方案。

public ListArticle getAllJavaArticles() {

return articles.stream()

.filter(article - article.getTags().contains("Java"))

.collect(Collectors.toList());

}

在这个例子里我们使用 collection 操作在返回流上执行少量代码而不是手动声明一个集合并显式地添加匹配的文章到集合里。

到目前为止还不错。是时候举一些突出Stream API强大的例子了。

根据作者来把所有的文章分组。

照旧,我们使用循环方案。

public MapString, ListArticle groupByAuthor() {

MapString, ListArticle result = new HashMap();

for (Article article : articles) {

if (result.containsKey(article.getAuthor())) {

result.get(article.getAuthor()).add(article);

} else {

ArrayListArticle articles = new ArrayList();

articles.add(article);

result.put(article.getAuthor(), articles);

}

}

return result;

}

我们能否找到一个使用流操作的简洁方案来解决这个问题?

public MapString, ListArticle groupByAuthor() {

return articles.stream()

.collect(Collectors.groupingBy(Article::getAuthor));

}

很好!使用 groupingBy 操作和 getAuthor 方法,我们得到了更简洁、可读性更高的代码。

现在,我们查找集合中所有不同的标签。

我们从使用循环的例子开始。

public SetString getDistinctTags() {

SetString result = new HashSet();

for (Article article : articles) {

result.addAll(article.getTags());

}

return result;

}

好,我们来看看如何使用Stream操作来解决这个问题。

public SetString getDistinctTags() {

return articles.stream()

.flatMap(article - article.getTags().stream())

.collect(Collectors.toSet());

}

棒极了!flatmap 帮我把标签列表转为一个返回流,然后我们使用 collect 去创建一个集合作为返回值。

一切皆有可能

以上的就是如何使用可读性更高的代码代替循环的例子。务必仔细看看Stream API,因为这篇文章仅仅提到它的一些皮毛而已。

java8分组几种用法的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、java8分组几种用法的信息别忘了在本站进行查找喔。