我想将 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)
但我不知道如何得到结果。
我有班级中的学生成绩地图,我想按成绩进行计数,可以通过迭代值然后增加地图中的计数来完成,是否有更好的使用 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
在变量“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 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) 我是第一次尝试 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)
我尝试过一些类似的方法/调整,但尚未取得突破。提示赞赏。
我有一份员工名单如下:
[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)
谢谢帮忙。
阿什利
我有一个类似如下所示的 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 满足的一些条件是:
谁能帮我解决这个问题
在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) 考虑以下数据结构:
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 来创建它?
所以我想从数据库中的实体返回 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 上收集工作吗?