如何在java 8中为列表分配增量值

rez*_*tin 5 java java-8

您假设有一个对象列表。该列表按该对象的一个​​或多个字段排序。所以根据排序列表,我想用增量值设置该对象的字段。
为了澄清,请注意以下示例:

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表达式

Ous*_* D. 5

沿着这条线的东西应该工作:

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)

注意,我没有编译这段代码。

  • @Lino 我会避免在这里使用 `peek`,因为这不是它的预期目的。但是我们总是可以创建一种方法来克隆列表`e` 中的对象,然后_then_ 设置id 并返回新列表。顺便说一句,感谢您澄清它可以编译;)。 (2认同)

Tim*_*kle 1

这也许是可能的,但您很可能不应该使用流 API来解决它。

\n\n

原因是流 API是函数式编程的 Java 实现,而 FP 中的关键假设之一是对象(或者更好的是任何数据)彼此没有关系 ,并且 没有函数更改输入数据的状态

\n\n

因此,您的要求违反了 FP 的关键假设。

\n\n
\n

你有什么想法来实现我的目标?\xe2\x80\x93\xc2\xa0reza 拉梅扎尼晨报

\n
\n\n

按用户 ID 对对象进行分组:

\n\n
Map<Integer,ObjectTest> userIdMap= objTests.stream()\n    .collect(Collectors.groupingBy(\n                           ot ->ot.userId , ot ->ot\n                    ));\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用遗留循环进行枚举:

\n\n
for(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}\n
Run Code Online (Sandbox Code Playgroud)\n