您假设有一个对象列表。该列表按该对象的一个或多个字段排序。所以根据排序列表,我想用增量值设置该对象的字段。
为了澄清,请注意以下示例:
public class ObjectTest {
int id;
int userId;
int code;
}
Run Code Online (Sandbox Code Playgroud)
和上面的 ObjectTest 一样,任何用户都有自己的代码。
有一个 ObjectTest 列表。
List<ObjectTest> objTests;
Run Code Online (Sandbox Code Playgroud)
它是排序的:
objTests.sort(Comparator.comparing(DataSet::getUserId).thenComparing(DataSet::getCode));
Run Code Online (Sandbox Code Playgroud)
因此,在按 userId 和代码排序后,我想将值从 1 设置为任何用户都有自己的代码的位置。当 userId 更改时,增量值再次重置为 1。
如果有以下ObjectTest的集合。
id userId code
--------------------------------
100 5
200 6
100 7
200 9
200 10
100 2
Run Code Online (Sandbox Code Playgroud)
在解释了上面的场景之后,下面的集合将是:
id userId code
1 100 2
2 100 5
3 100 7
1 200 6
2 200 9
3 200 10
Run Code Online (Sandbox Code Playgroud)
java中是否可以使用lambda表达式
沿着这条线的东西应该工作:
List<ObjectTest> resultSet =
objTests.stream()
.sorted(Comparator.comparing(ObjectTest::getUserId).thenComparing(ObjectTest::getCode))
.collect(Collectors.groupingBy(ObjectTest::getUserId, LinkedHashMap::new, Collectors.toList()))
.values()
.stream()
.map(e -> {
IntStream.range(0, e.size())
.forEach(i -> e.get(i).setId(i + 1));
return e;
})
.flatMap(Collection::stream)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
注意,我没有编译这段代码。
这也许是可能的,但您很可能不应该使用流 API来解决它。
\n\n原因是流 API是函数式编程的 Java 实现,而 FP 中的关键假设之一是对象(或者更好的是任何数据)彼此没有关系 ,并且 没有函数更改输入数据的状态。
\n\n因此,您的要求违反了 FP 的关键假设。
\n\n\n\n\n你有什么想法来实现我的目标?\xe2\x80\x93\xc2\xa0reza 拉梅扎尼晨报
\n
按用户 ID 对对象进行分组:
\n\nMap<Integer,ObjectTest> userIdMap= objTests.stream()\n .collect(Collectors.groupingBy(\n ot ->ot.userId , ot ->ot\n ));\nRun Code Online (Sandbox Code Playgroud)\n\n使用遗留循环进行枚举:
\n\nfor(Collection<ObjectTest> ol : userIdMap.values()){\n objectList = new ArrayList(ol);\n Colections.sort(ol, /* comparator here*/);\n for(int id = 0; id < ol.size();)\n objectList.get(id).id=++id;\n}\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
2151 次 |
| 最近记录: |