标签: java-stream

为什么在这里省略泛型类型参数是可以接受的?

在以下代码段中:

public class IDMapBase<T> extends HashMap<DeviceID, T> {
    public Map<DeviceID, T> filterMap(Set<DeviceID> neededIDs) {
        return entrySet().stream()
            .filter(e -> neededIDs.contains(e.getKey()))
            .collect(Collectors.toMap(Entry::getKey, Entry::getValue));
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么简单地说Entry::getXX而不是Entry<DeviceID, T>>::getXX?我认为这(Map.)Entry将默认为Entry<Object, Object>,它不能用作a的条目Map<DeviceID, T>.

java java-8 java-stream

1
推荐指数
1
解决办法
715
查看次数

Set :: size上的groovy错误中的Java流收集器

我正在尝试SELECT MAX(COUNT DISTINCT field_x) FROM stream GROUP BY field_y;使用Java Streams/Collectors在一个groovy脚本中做一个.基本上,我想要一个解决方案COUNT DISTINCT,我可以接受.max.

我一直在尝试这篇文章中的解决方案:java 8 - stream,map和count distinct

但得到错误:

unexpected token: : @ line 65, column 114.
   ")}, Collectors.toSet()), Set::size).val
Run Code Online (Sandbox Code Playgroud)

Groovy中似乎有一个问题Set::size和Map::size.

我已经导入都java.util.Map和java.util.Set无济于事.这是Groovy语法/导入Java类的问题还是我正在使用的问题Collectors?作为参考,我只是尝试在原始后期解决方案中在此地图上实现forEach println:

Map<Integer, Integer> map = bids.stream().collect(
    groupingBy(
            Bid::getBidderUserId,
            collectingAndThen(
                    mapping(Bid::getAuctionId, toSet()),
                    Set::size)));
Run Code Online (Sandbox Code Playgroud)

如果这更适合作为评论而道歉,但显然需要更多的声誉来评论而不是提问.

java groovy java-8 java-stream collectors

1
推荐指数
1
解决办法
333
查看次数

流不在for循环中工作

BigDecimal getInterest(List<Investment> investments) {
        BigDecimal interest = BigDecimal.ZERO;
        for (Investment i: investments) {
            i.getTransactions().stream()
                    .map(Transaction::getAmount)
                    .forEach(interest::add);
        }
        return interest;
    }
Run Code Online (Sandbox Code Playgroud)

这种方法的问题是它总是返回零.看起来好像 .forEach()没有消耗它的论点.但是如果我按照下面的方式编写它,一切都运行正常.任何人都知道为什么第一种方法不起作用?

BigDecimal getInterest(List<Investment> investments) {
        BigDecimal interest = BigDecimal.ZERO;
        for (Investment i: investments) {
            interestPaid = interest.add(i.getTransactions().stream()
                    .map(Transaction::getAmount)
                    .reduce(BigDecimal.ZERO, BigDecimal::add));
        }
        return interest;
    }
Run Code Online (Sandbox Code Playgroud)

java lambda java-8 java-stream

1
推荐指数
1
解决办法
148
查看次数

如何使用Java 8流将映射键转换为大写?

我有如下方法

private Map<String,List<String>>  createTableColumnListMap(List<Map<String,String>> nqColumnMapList){

        Map<String, List<String>> targetTableColumnListMap = 
                nqColumnMapList.stream()
                     .flatMap(m -> m.entrySet().stream())
                     .collect(groupingBy(Map.Entry::getKey, mapping(Map.Entry::getValue, toList())));
        return targetTableColumnListMap;
    }
Run Code Online (Sandbox Code Playgroud)

我想大写地图键,但找不到一种方法。有没有Java 8的方法来实现这一目标?

hashmap java-8 java-stream

1
推荐指数
2
解决办法
9235
查看次数

返回Java Streams中的N个最后元素

这个问题只是为了好玩.

我有这个方法:

private static String getBaseDomain(String fullDomain) {
    // we take the base domain from the usual xxx.yyy.basedomain.tld: we 
    // want only the last 2 elements: basedomain.tld
    List<String> elements = Arrays.asList(fullDomain.split("\\."));
    if( elements.size() > 2){
        elements = elements.subList(elements.size()-2, elements.size());
    }
    return String.join(".", elements);
}
Run Code Online (Sandbox Code Playgroud)

我想知道如何使用java流API获得相同的结果(实际上,我想知道哪种方法是最节省资源的).

我无法想象如何仅从流中获取最后2个元素:limit(2)将给出前两个元素,并且skip(XXX)我不知道如何提取流"inline"的大小.

你能告诉我你会怎么做吗?

java string split java-8 java-stream

1
推荐指数
1
解决办法
2348
查看次数

Java 8 - 使用Stream API使用相同对象填充arraylist的正确方法是什么?

我是Stream API的新手,我正在寻找更优雅和最短的方法来使用相当于此代码的Stream API 来填充具有相同对象的ArrayList :

SomeObject someObject = new SomeObject();
List<SomeObject> someObjectList = new ArrayList<>();

int maxLimitValue = 70; //for example
for(int i=0; i<=maxLimitValue; i++){
   someObjectList.add(someObject);
}
Run Code Online (Sandbox Code Playgroud)

我已经看到了许多不同的解决方案来完成当前的任

这个变体几乎就是我想要的,但是有一个对象的自动生成,但我需要使用一次创建的相同对象.

这个解决方案也几乎是我需要的,但我不确定这个对象的复制,返回的List类型不是 ArrayList(它返回了CopiesList类型,在将来的操作中无法添加到ArrayList).

ps也许它可能重复,但我真的找不到使用Stream API执行此操作的正确和简短的方法.

更新(assylias添加):

是的,我同意你的观点:

List<SomeObject> list = Collections.nCopies(70, someObject);
Run Code Online (Sandbox Code Playgroud)

但是,当我打开这个方法时:

public static <T> List<T> nCopies(int n, T o) {
        if (n < 0)
            throw new IllegalArgumentException("List length = " + n);
        return new CopiesList<>(n, o);
    }
Run Code Online (Sandbox Code Playgroud)

正如我们所见 - 它返回CopiesList对象,而不是ArrayList.另外,作为其他列表,它正在扩展AbstractList:

private static class CopiesList<E>
        extends …
Run Code Online (Sandbox Code Playgroud)

java collections arraylist java-stream

1
推荐指数
1
解决办法
1838
查看次数

Java 8 List &lt;T&gt;到Map &lt;T,(index)&gt;

是否有一种方便的Java8流API方式从List<T> to Map<T, (index)>以下示例进行转换:

    List<Character> charList = "ABCDE".chars().mapToObj(e->(char)e).collect(Collectors.toList());

    Map<Character, Integer> map = new HashMap<>();
    for (int i = 0; i < charList.size(); i++) {
        map.put(charList.get(i), i);
    }
Run Code Online (Sandbox Code Playgroud)

映射= {A = 0,B = 1,C = 2,D = 3,E = 4}

java lambda java-8 java-stream

1
推荐指数
1
解决办法
1977
查看次数

在Java 8中,如何一次遍历两个数组?

我正在编写一个从CSV文件中获取数据的Java程序.对于每一行数据,我需要使用相应的标题作为键将每个数据元素放入映射中.例如,headerRow [7]和dataElements [7]应该是地图中的键值对.

下面是我传统上使用Java编写的代码:

private Map<String, Double> readLine(String[] headerRow, String[] dataElements) {
    Map<String, Double> headerToDataMap = new HashMap<>(); 
    for (int i=0; i < nextLine.length; i++) {
        headerToDataMap.put(headerRow[i], Double.valueOf(dataElements[i]));
    }
    return headerToDataMap;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法可以使用Java 8流编写这段代码 - 请记住我是在同时迭代两个数组?

java arrays java-stream

1
推荐指数
1
解决办法
1611
查看次数

使用Map值在Java 8中使用流进行分组

我正在尝试按产品类别对Product类的对象列表进行分组。不幸的是,Product类的编写方式是这样的:

class Product {
    Map<String, String> property;
}
Run Code Online (Sandbox Code Playgroud)

产品类包含一个属性映射,这些属性之一称为“ ProductType”。例如,地图可以包含:

ProductType : Machine
Price : 1000
Name : Motor Cutter
......
Run Code Online (Sandbox Code Playgroud)

我们有一个产品清单。我在想用ProductType将它们分组为Map<String, List<Product>>使用Java 8的流和lamda表达式的正确方法是什么。

如果将Product类定义为:答案是显而易见的。

class Product {
    String ProductType;
    Double Price;
    String Name;
}
Run Code Online (Sandbox Code Playgroud)

但是有了我们最上面的定义,我不知道如何实现这一点。

有人可以帮忙吗?

java java-8 java-stream

1
推荐指数
1
解决办法
857
查看次数

Java 8 Stream - Reduce函数的组合器没有被执行

我使用一个简单的reduce方法,有三个参数即.身份,累加器和组合器.这是我的代码......

Integer ageSumComb = persons
            .stream()
            .reduce(0,
                (sum, p) -> {
                    System.out.println("Accumulator: Sum= "+ sum + " Person= " + p);
                    return sum += p.age;
                },
                (sum1, sum2) -> {
                    System.out.format("Combiner: Sum1= " + sum1 + " Sum2= "+ sum2);
                    return sum1 + sum2;
Run Code Online (Sandbox Code Playgroud)

但正在发生的事情是Combiner没有被执行.我没有得到这背后的原因.这是我的输出..

Accumulator: Sum= 0 Person= Max
Accumulator: Sum= 18 Person= Peter
Accumulator: Sum= 41 Person= Pamela
Accumulator: Sum= 64 Person= David
Accumulator: Sum= 76 Person= Pam
Run Code Online (Sandbox Code Playgroud)

但是,没有编译错误,没有异常,我的输出完全正确,与我的预期相同.但是没有得到为什么组合器没有执行.

java reduce java-8 combiners java-stream

1
推荐指数
1
解决办法
316
查看次数