Использование потоков для группировки атрибутов карты из внутренних объектов?

Я не мог заставить решение Suppressingfire работать, когда «источник» с консоли R.

Лучшее из обоих миров?

thisFile <- function() {
        cmdArgs <- commandArgs(trailingOnly = FALSE)
        needle <- "--file="
        match <- grep(needle, cmdArgs)
        if (length(match) > 0) {
                # Rscript
                return(normalizePath(sub(needle, "", cmdArgs[match])))
        } else {
                # 'source'd via R console
                return(normalizePath(sys.frames()[[1]]$ofile))
        }
}
8
задан Nikolas 18 January 2019 в 15:55
поделиться

2 ответа

Существует способ, использующий только методы :

Map<String, Set<Object>> result = pResolved.stream()                        
    .map(Resource::getCapabilities)                         // Stream<List<Capability>>
    .flatMap(List::stream)                                  // Stream<Capability>
    .collect(Collectors.toMap(                              // Map<String, Set<Object>>
        c -> c.getNamespace(),                              // Key: String (namespace)
        i -> new HashSet<>(i.getAttributes().values())));   // Value: Set of Map values

Давайте предположим, что пример ввода:

Resource [capabilities=[
    Capability [namespace=a, attributes={a1=aa1, a2=aa2, a3=aa3}]]]
Resource [capabilities=[
    Capability [namespace=b, attributes={b2=bb2, b3=bb3, b1=bb1}], 
    Capability [namespace=c, attributes={c3=cc3, c1=cc1, c2=cc2}]]]

Тогда код выше приведет к:

a: [aa1, aa3, aa2]
b: [bb1, bb3, bb2]
c: [cc1, cc3, cc2]
0
ответ дан Nikolas 18 January 2019 в 15:55
поделиться

Вместо этого вы можете использовать Collectors.toMap в качестве downstream:

Map<Resource, Map<String, Object>> result = pResolved
        .stream()
        .collect(groupingBy(Function.identity(),
                flatMapping(resource -> resource.getCapabilities().stream(),
                        flatMapping(cap -> cap.getAttributes().entrySet().stream(),
                                toMap(Map.Entry::getKey, Map.Entry::getValue)))));
0
ответ дан Naman 18 January 2019 в 15:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: