标签: java-stream

Java 8 将 Map<Long, List<MyClass>> 流式传输到 Map<Long, Set<Long>>

我想将 a 转换(使用 Java 8 流),Map<Long, List<MyClass>>其中Map<Long, Set<Long>>代表Set<Long>每个.idMyClassList

我努力了:

myFirstMap.entrySet().stream()
      .map(e -> e.getValue().stream()
          .map(MyClass::getId)
          .collect(Collectors.toSet()))
Run Code Online (Sandbox Code Playgroud)

但我不知道如何得到结果。

java java-8 java-stream

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

使用 java 流按映射中的值进行分组

我有班级中的学生成绩地图,我想按成绩进行计数,可以通过迭代值然后增加地图中的计数来完成,是否有更好的使用 Streams 的方法。

    Map<String, String> grades = new HashMap();
    grades.put("100", "A");
    grades.put("101", "B");
    grades.put("102", "A");
    grades.put("103", "C");
    grades.put("104", "D");
    grades.put("105", "B");
    grades.put("106", "B");
    grades.put("107", "C");
Run Code Online (Sandbox Code Playgroud)

我的输出映射应该有 A=2、B=3、C=2、D=1

java hashmap java-8 java-stream

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

我如何获得对象数组的值的总和:java8

在变量“a”中我创建一个double数组,在“maxA”中我得到值的总和。现在在变量“b”中,我创建一个具有双值的对象数组,现在我想使用该stream值获得这些值的总和。感谢帮助

  double[] a = new double[] {3.0,1.0};
  double maxA = Arrays.stream(a).sum();

  ObjectWithDoubleValue  o1 = new  ObjectWithDoubleValue (3.0);
  ObjectWithDoubleValue  o2 = new  ObjectWithDoubleValue (1.0);
  ObjectArray[] b = {o1 , o2};
  double maxB = ?;
Run Code Online (Sandbox Code Playgroud)

java arrays functional-programming object java-stream

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

Java 8 流上的缓冲区运算符

我正在尝试编写一个 java 8 流收集器,它反映了rxjava 缓冲区运算符的功能

我有一个工作代码:

// This will gather numbers 1 to 13 and combine them in groups of
// three while preserving the order even if its a parallel stream.
final List<List<String>> triads = IntStream.range(1, 14)
        .parallel()
        .boxed()
        .map(Object::toString)
        .collect(ArrayList::new, accumulator, combiner);

System.out.println(triads.toString())
Run Code Online (Sandbox Code Playgroud)

这里的累加器是这样的:

final BiConsumer<List<List<String>>, String> accumulator = (acc, a) -> {
      StringBuilder stringBuilder = new StringBuilder();
      stringBuilder.append("Accumulator|");
      stringBuilder.append("Before: ").append(acc.toString());
      int accumulatorSize = acc.size();
      if (accumulatorSize == 0) {
        List<String> newList = new ArrayList<>();
        newList.add(a);
        acc.add(newList); …
Run Code Online (Sandbox Code Playgroud)

java functional-programming java-8 rx-java java-stream

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

java8 流的类型推断

我是第一次尝试 java8 流,并且对类型推断的语法有点困惑。这是片段:

其核心是:

Arrays.stream(stringArray).mapToInt(Integer::parseInt).collect(Collectors.toList()));
Run Code Online (Sandbox Code Playgroud)

这导致:

Error:(56, 84) java: method collect in interface java.util.stream.IntStream cannot be applied to given types;
  required: java.util.function.Supplier<R>,java.util.function.ObjIntConsumer<R>,java.util.function.BiConsumer<R,R>
  found: java.util.stream.Collector<java.lang.Object,capture#1 of ?,java.util.List<java.lang.Object>>
  reason: cannot infer type-variable(s) R
    (actual and formal argument lists differ in length)
Run Code Online (Sandbox Code Playgroud)

这是一个更完整的片段:

try {
    br =  new BufferedReader(new FileReader(inputFile));
} catch (FileNotFoundException e) {
    e.printStackTrace();
}
String line = null;
while ((line = br.readLine()) != null) {
  list.add(Arrays.stream(line.split(","))
  .mapToInt(Integer::parseInt).collect(Collectors.toList()));
}
Run Code Online (Sandbox Code Playgroud)

我尝试过一些类似的方法/调整,但尚未取得突破。提示赞赏。

java java-stream

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

从java中的数组列表中获取唯一对象的列表

我有一份员工名单如下:

[Employee{id="1", NID="A123", wages=5000},
 Employee{id="2", NID="B123", wages=1000},
 Employee{id="3", NID="C123", wages=2000},
 Employee{id="4", NID="C123", wages=3000}]
Run Code Online (Sandbox Code Playgroud)

我需要能够仅检索唯一的对象,并且在 NID 相同的情况下,我需要检索具有最大 Id 的对象。所以最终的列表应该是这样的

[Employee{id="1", NID="A123", wages=5000},
 Employee{id="2", NID="B123", wages=1000},
 Employee{id="4", NID="C123", wages=3000}]
Run Code Online (Sandbox Code Playgroud)

我知道可以使用嵌套 for 循环来完成此操作,但我想使用 Java 流来完成此操作。我可以通过使用 group by 找到列表中重复的员工,但我仍然不知道如何像上面那样获取列表。

 Map<String, List<Employee>> groupByNid = employeeList.stream().collect(Collectors.groupingBy(Employee::getNID));
Run Code Online (Sandbox Code Playgroud)

谢谢帮忙。

阿什利

java java-stream

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

使用 Java8 Stream 获取字符串值(如果存在)或 null(如果不存在)

我有一个类似如下所示的 json。需求是根据id获取key值。IE。假设如果 Id 是 A1键值应返回2gAwIBAgIQKGZsKfAUzaJHVantyrwVdzANBgkqhkiG9w0BAQs。键数组始终只包含一个元素。

{
  "keys": [
    {
      "id": "A1",
      "key": [
        "2gAwIBAgIQKGZsKfAUzaJHVantyrwVdzANBgkqhkiG9w0BAQs"
      ]
    },
     {
      "id": "A2",
      "key": [
        "swKQYDVQQDEyJhY2NvdW50cy5hY2Nlc3Njb250cm9sfsf2dew"
      ]
    },
     {
      "id": "A3",
      "key": [
        "EyJhY2NvdW50cy5hY2Nlc3Njb250cm9sLndpbmRvd3Mubdwe2"
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

为了实现上述内容,我使用 Java8 Stream 编写了以下代码,但问题是它返回了Optional<KeyDetails>我需要再次解析并获取键值的内容

String keyDetails = "{\"keys\":[{\"id\":\"A1\",\"key\":[\"2gAwIBAgIQKGZsKfAUzaJHVantyrwVdzANBgkqhkiG9w0BAQs\"]},{\"id\":\"A2\",\"key\":[\"swKQYDVQQDEyJhY2NvdW50cy5hY2Nlc3Njb250cm9sfsf2dew\"]},{\"id\":\"A3\",\"key\":[\"EyJhY2NvdW50cy5hY2Nlc3Njb250cm9sLndpbmRvd3Mubdwe2\"]}]}";
AccessKeys accessKeys = new ObjectMapper().readValue(keyDetails, AccessKeys.class);
Optional<KeyDetails> filteredKey = accessKeys.getKeys().stream().filter(key-> key.getId().equals("A3")).findAny();
if(filteredKey.isPresent()) {
    String keyValue = filteredKey.get().getKey().get(0);
    System.out.println("keyValue==>"+keyValue);
}
Run Code Online (Sandbox Code Playgroud)

我想要的是得到Optional<String>而不是Optional<KeyDetails>。即,如果 id 存在,它应该只返回键数组中存在的键值。

json 满足的一些条件是:

  • 有时可能会出现重复密钥 ID 的情况,在这种情况下它应该只选择一个(第一个)
  • 键数组将始终包含一个字符串值

谁能帮我解决这个问题

java collections filtering java-8 java-stream

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

Java流中的中间操作

在java 8中,我使用Streams打印输出,但大小为0。为什么?

public class IntermediateryAndFinal {
    public static void main(String[] args) {
        Stream<String> stream = Stream.of("one", "two", "three", "four", "five");

        Predicate<String> p1 = Predicate.isEqual("two");
        Predicate<String> p2 = Predicate.isEqual("three");

        List<String> list = new ArrayList<>();

        stream.peek(System.out::println)
            .filter(p1.or(p2))
            .peek(list::add);
        System.out.println("Size = "+list.size());
    }
}
Run Code Online (Sandbox Code Playgroud)

java collections java-8 java-stream

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

Java:创建 HashMaps ArrayList 的副本,但仅包含某些键

考虑以下数据结构:

ArrayList<HashMap<String, String>> entries = new ArrayList<>();

ArrayList<String> keyNamesToInclude = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

此代码创建条目的副本,但哈希映射仅包含 keyNamesToInclude 中的键:

ArrayList<HashMap<String, String>> copies = new ArrayList<>();

for (HashMap<String, String> entry: entries) {
  HashMap<String, String> copy = new HashMap<>();
  for (String keyName: keyNamesToInclude) {
    copy.put(keyName, entry.get(keyName));
  }
  copies.add(copy);
}
Run Code Online (Sandbox Code Playgroud)

如何以一种功能性的方式使用 Streams 来创建它?

java arraylist java-stream

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

从 Optional 返回集合

所以我想从数据库中的实体返回 Set 。所以我有 crudRepository,首先我通过 id 从 repo 中返回可选的 Knight,然后我想从 Optionlal 获取他的一组任务

public Set<Quest> getAllUserStories(Long id)
    {
        Optional<Knight> knight = knightRepository.findById(id);
       Set<Quest>set = knight.stream().map(k->k.getQuests()).collect(Collectors.toSet());


        return listToReturn;
    }

Run Code Online (Sandbox Code Playgroud)

它几乎可以工作,但它的一套,我不知道如何在不设置的情况下夹住一些东西?另一个问题是,如果那组任务是空的,会在 null 上收集工作吗?

java jpa optional java-stream

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