标签: java-stream

Java 8流将<K,V>映射到List <T>

鉴于我有一些函数需要两个参数并返回一个值,是否可以将Map转换为Stream中的List作为非终端操作?最近的I cam找到的是在地图上使用forEach来创建实例并将它们添加到预定义的List中,然后从该List开始一个新的Stream.还是我错过了什么?

例如:经典"在一些长词中找到3个最常出现的单词"

wordList.stream().collect(groupingBy(Function.identity, Collectors.counting))).
Run Code Online (Sandbox Code Playgroud)

(现在我想流式传输那个地图的entrySet)

sorted((a,b) -> a.getValue().compareTo(b.getValue))).limit(3).forEach(print...
Run Code Online (Sandbox Code Playgroud)

java lambda java-8 java-stream

23
推荐指数
1
解决办法
5万
查看次数

如何在Java 8中使用collect调用?

让我们说我们必须使用这段无聊的代码:

ArrayList<Long> ids = new ArrayList<Long>();
for (MyObj obj : myList){
    ids.add(obj.getId());
}
Run Code Online (Sandbox Code Playgroud)

切换到Java 8后,我的IDE告诉我我可以用这个代码替换collect call它,并自动生成:

ArrayList<Long> ids = myList.stream().map(MyObj::getId).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

但是它给了我这个错误:

Steam中的collect(java.util.stream.Collector)无法应用于:(java.util.stream.Collector,capture,java.util.List>)

我试图铸造参数,但它给我不确定的A和R,而IDE没有给任何建议.

我很好奇你collect call在这种情况下如何使用,我找不到任何可以指导我的信息.任何人都可以光明吗?

java collect java-8 java-stream

23
推荐指数
1
解决办法
3万
查看次数

在Java 8中用流替换嵌套for循环的正确方法是什么?

在学习Java 8流和lambas时,我尝试用流替换以下嵌套for循环:

List<Long> deskIds = new ArrayList<>();
for(ProvidedService memberService : service.getAllNodesDepthFirst()){
   for(Desk d : memberService.getDesks()){
     deskIds.add(d.getId());
   }
}
Run Code Online (Sandbox Code Playgroud)

循环迭代一个'ProvidedService'对象列表,并为每个对象迭代'Desk'对象的list属性,并将'Id'字段提取到列表中.

我使用流来提出以下代码:

List<Long> deskIds = new ArrayList<>();
service.getAllNodesDepthFirst().stream().forEach(srv -> {
    deskIds.addAll(srv.getDesks().stream().map(Desk::getId).collect(Collectors.toList()));
});
Run Code Online (Sandbox Code Playgroud)

这是正确/最佳的方式吗?或者有没有办法在没有第二个嵌套流的情况下执行此操作?

java java-8 java-stream

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

Java 7中的java流

我的问题可能过于宽泛,可能答案很简单,但我不得不问.

Java 7中是否有(Java 8)流*的等效实现?

我熟悉(Java 8)流,但我的项目要求是使用Java 7.

*不要与inputStream和outputStream混淆.

java java-stream

23
推荐指数
2
解决办法
3万
查看次数

在分组后排序列表

我想知道,如果流(或收集器)中已经有一个已实现的功能,它已将列表排序为值.例如,以下代码均生成按年龄分类的按性别分组的人员列表.第一个解决方案有一些开销排序(看起来有点邋)).第二个解决方案需要两次看每个人,但是以一种漂亮的方式完成工作.

首先排序然后在一个流中分组:

Map<Gender, List<Person>> sortedListsByGender = (List<Person>) roster
        .stream()
        .sorted(Person::compareByAge)
        .collect(Collectors.groupingBy(Person::getGender));
Run Code Online (Sandbox Code Playgroud)

首先分组,然后对每个值进行排序:

Map<Gender, List<Person>> sortedListsByGender = (List<Person>) roster
        .stream()
        .collect(Collectors.groupingBy(Person::getGender));
sortedListsByGender.values()
        .forEach(list -> Collections.sort(list, Person::compareByAge));
Run Code Online (Sandbox Code Playgroud)

我只是想知道,如果已经有一些实现的东西,它会在一次运行中完成,例如groupingBySorted.

java java-stream

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

Java和两个double [] []并行流

假设我有这两个矩阵:

double[][] a = new double[2][2]
a[0][0] = 1
a[0][1] = 2
a[1][0] = 3
a[1][1] = 4

double[][] b = new double[2][2]
b[0][0] = 1
b[0][1] = 2
b[1][0] = 3
b[1][1] = 4
Run Code Online (Sandbox Code Playgroud)

以传统方式,总结这个矩阵我会做一个嵌套for循环:

int rows = a.length;
int cols = a[0].length;
double[][] res = new double[rows][cols];
for(int i = 0; i < rows; i++){
    for(int j = 0; j < cols; j++){
        res[i][j] = a[i][j] + b[i][j];
    }
}
Run Code Online (Sandbox Code Playgroud)

我对流API很新,但我认为这非常适合使用,parallelStream所以我的问题是,如果有办法做到这一点并利用并行处理?

编辑:不确定这是不是正确的地方,但我们走了:使用一些建议我把Stream推到测试.设置如下:经典方法:

public class ClassicMatrix …
Run Code Online (Sandbox Code Playgroud)

java arrays java-8 java-stream

23
推荐指数
3
解决办法
2173
查看次数

How to convert multiple list into single list using Java streams?

I have an class A with multiple List members.

class A {
    List<X> xList;
    List<Y> yList;
    List<Z> zList;
    
    // getters and setters
}

class X {
     String desc;
     String xtype;
    
     // getters and setters    
}

class Y {   
    String name;
    String ytype;
    
    //getters and setters
}

class Z {
    String description;
    String ztype;
    
    // getters and setters    
}
Run Code Online (Sandbox Code Playgroud)

And a class B with just 2 attributes:

class B {
    String name;
    String type;     
}
Run Code Online (Sandbox Code Playgroud)

I need to iterate through the …

java java-stream

23
推荐指数
4
解决办法
948
查看次数

使用 Comparator.comparing(HashMap::get) 作为比较器时的意外行为

在https://java-programming.mooc.fi/part-10/2-interface-comparable上做练习“文学”时,我在尝试对 HashMap 中的键值对进行排序时发现了一个非常奇怪的行为,而没有将任何内容复制到一个树形图。我应该通过创建 Book 类并将它们添加到 List 来添加书籍。但是我想在不创建新类的情况下尝试,所以选择了 HashMap。我的代码如下:

public class MainProgram {

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);

    Map<String, Integer> bookshelf = new HashMap<>();
    while (true) {


        System.out.println("Input the name of the book, empty stops: ");
        String bookName = scanner.nextLine();
        if (bookName.equals("")) {
            break;
        }
        System.out.println("Input the age recommendation: ");
        int age = Integer.valueOf(scanner.nextLine());

        bookshelf.put(bookName, age);
    }

    System.out.println(bookshelf.size() + " book" + (bookshelf.size() > 1 ? "s" : "") + " in total."); …
Run Code Online (Sandbox Code Playgroud)

java sorting hashmap java-stream method-reference

23
推荐指数
2
解决办法
689
查看次数

重复键(尝试合并值 x 和 x)

我有一个简单的课程:

public class Rule {
    int id;
    long cableType;
}
Run Code Online (Sandbox Code Playgroud)

我想将包含此类对象的列表转换为Map<Integer, Long>,所以我编写了代码:

Map<Integer, Long> map = ruleList.stream().collect(Collectors.toMap(Rule::getId, Rule::getCableType));
Run Code Online (Sandbox Code Playgroud)

该列表有一个重复项(1, 10), (1,40),当我运行此代码时,我收到此异常:

Exception in thread "main" java.lang.IllegalStateException: Duplicate key 21 (attempted merging values 31 and 30)
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?

java java-stream

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

试图找到满足n + x = n ^ x的x的数量会因超时而失败

我正在尝试使用Java 8的新功能(例如s)从Hacker Rank站点的Bit Manipulation部分解决以下问题.Stream

问题描述:

给定一个整数n,找到每个x,使得:

  • 0 <= x <= n
  • n + x = n ^ x

其中^表示按位XOR运算符.然后打印一个整数,表示满足上述条件的x的总数.

约束

  • 0 <= n <= 10 15

样本输入: 5

样本输出: 2

说明:

对于n = 5,x值0和2满足条件:

  • 5 + 0 = 5 ^ 0 = 5
  • 5 + 2 = 5 ^ 2 = 7

因此,我们打印2作为我们的答案.

样本输入: 10

样本输出: 4

说明: 对于N = 10,该X值0 …

java algorithm bit-manipulation xor java-stream

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