我有两个列表,我想将列表 1 的每个元素与列表 2 的每个元素进行比较,并在列表 3 中获得结果,例如
List1 = {99,22,33}
list2 = {11,24,33}
Run Code Online (Sandbox Code Playgroud)
结果:
list3 = {1,-1,0}
Run Code Online (Sandbox Code Playgroud)
我如何最好使用流来做到这一点?
你好我写了以下代码
for (Object1 o1 : listObject1) {
boolean found = false;
for (Object2 o2 : listObject2) {
found = o2.getKey().equals(o1.getKey());
if (found) break;
}
if (!found) listObject2.add(new Object2(o1.getKey()));
}
Run Code Online (Sandbox Code Playgroud)
但我想使用流在 Java 8 中编写它。我尝试使用 flatMap 但我没有成功。有人能帮我吗 ?并向我解释 flatmap 的使用?
谢谢
我有这个数组:
Integer[] originalItems = itemsArray.stream()
.distinct()
.sorted()
.toArray(Integer[]::new);
Run Code Online (Sandbox Code Playgroud)
我想返回它 asint[]而不是 as Integer[]。
我试图打电话,.toArray(int[]::new)但我收到此错误:
不存在类型变量 A 的实例,因此 int[] 符合 A[]
我有一个 Foo 列表,在每个 Foo 上,我应用了一个处理器方法来获取ValidItem.
如果处理中出现错误,那么我返回ErrorItem.
现在如何通过 Java 8 流处理它以得到 2 个不同列表形式的结果
List<Foo> FooList = someList....;
class ValidItem extend Item{......}
class ErrorItem extend Item{......}
Item processItem(Foo foo){
return either an object of ValidItem or ErrorItem;
}
Run Code Online (Sandbox Code Playgroud)
我相信我能做到
Map<Class,List<Item>> itemsMap =
FooList
.stream()
.map(processItem)
.collect(Collectors.groupingBy(Object::getClass));
Run Code Online (Sandbox Code Playgroud)
但作为List<Parent>不是一个List<Child>让我无法强制转换地图结果变成List<ValidItem>
现实ErrorItem,并ValidItem在所有,没有关系只是为这种蒸汽处理和processItem方法我着想两个完全不同的类让他们在同一层次通过扩展标记项目班级,。
在代码中的许多其他地方,我不能/不应该将 ValidItem 称为 Item ,因为它给出了它也可以是 ErroItem 的想法。
是否有使用流的正确方法,最后我得到 2 个列表。和 ErrorItem 和 ValidItem 没有扩展相同的 Item 类?
############## 更新##############
正如我所说的 ValidItem 和 …
我正在尝试获取字符串列表中的最大数量。
我的代码是:
List<String> list = new ArrayList<String>();
list.add("00657");
list.add("00632");
list.add("00656");
list.add("01125");
Integer maxNum = list.stream()
.mapToInt(Integer::intValue)
.max();
Run Code Online (Sandbox Code Playgroud)
上面的代码给出了一个错误。错误是:无法编译的源代码 - 错误的符号类型:java.util.stream.Stream.mapToInt.max。
我应该得到1125结果。我尝试了不同的方法,但都没有奏效。
我有这个代码:
SortedMap<String, Double> starsPerActivity = new TreeMap<>();
for(Product p : products.values()) {
for(Rating r : ratings) {
if(r.getProductName() == p.getName()) {
starsPerActivity.put(p.getActivityName(), this.getStarsOfProduct(p.getName()));
}
}
}
return starsPerActivity;
Run Code Online (Sandbox Code Playgroud)
我想用流重写这段代码。我试过了,但我不知道如何。
方法starsPerActivity() 返回一个映射,该映射将活动名称与属于该活动的产品的平均星星数相关联,活动名称按字母顺序排序。产品未评级的活动不应出现在结果中。
我有一个具有以下签名的方法:
int sum(Map<String, Integer> map, String target) { }
Run Code Online (Sandbox Code Playgroud)
我试图找到键具有前缀作为给定target字符串的条目的值的总和。我想使用流来做到这一点。这就是我所做的:
return map.entrySet().stream()
.filter((k, v) -> k.startsWith(target))
.map((k, v) -> v)
.sum();
Run Code Online (Sandbox Code Playgroud)
编译器给出以下错误:
错误:类型不兼容:lambda 表达式中的参数类型不兼容
我在这里做错了什么?
我想根据一个字段将三种不同类型的列表合并到一个列表中。
A(id, val1)
B(id, val2)
C(id, val3)
D(id, val1, val2, val3)
Run Code Online (Sandbox Code Playgroud)
List<A> AList;
List<B> BList;
List<C> CList;
Run Code Online (Sandbox Code Playgroud)
List<D> DList;
Run Code Online (Sandbox Code Playgroud)
使用流和谓词将 AList、BList、CList 合并到 DList。
一种方法是首先使用 n^2 复杂度合并 AList 和 BList 以获得 DList(带有 val1 和 val2);然后循环 DList 以再次使用 n^2 用 CList 填充 val3。所以复杂性将是
n^2 + n^2 = n^2
一季度。有没有更好的方法来提高复杂性?Q2。我想使用 Predicate 和 Stream 来解决这个问题,所以使代码可读性强。
如何按一系列可能的值对列表进行分组?如果我有一个类 Foo
class Foo{
int value;
}
Run Code Online (Sandbox Code Playgroud)
和一个 foosList<Foo>列表然后
list.stream().collect(Collectors.groupingBy(Foo::getValue));
Run Code Online (Sandbox Code Playgroud)
将我的具有相同价值的 foos 收集到一组中。但我想将一系列值归为一组。例如
values < 5 in group "A"
values > 5 && < 25 in group "B"
values >= 25 in group "C"
Run Code Online (Sandbox Code Playgroud)
或者另一个例子:假设我有一个整数列表:
List<Integer> list = List.of(2,3,4,9,11,17,28,29,32);
list.stream().collect(Collectors.groupingBy(
classifier,
Collectors.toList()));
Run Code Online (Sandbox Code Playgroud)
我试图把类似的东西放到分类器
i < 5 ? "A": i >= 5 && i < 25 ? "B" : "C";
Run Code Online (Sandbox Code Playgroud)
这给出了编译错误。怎么做?
我想从以下位置获取以下数据:
MyObject.builder()
.lastUpdated(tuple.getT2().isEmpty() ? null : tuple.getT2().get(0).getLastUpdated().toInstant())
...
...
.build()
Run Code Online (Sandbox Code Playgroud)
tuple.getT2().get(0).getLastUpdated() 可以为空...
我试过:
.lastUpdated(
tuple.getT2().stream()
.map(Optional::ofNullable)
.findFirst()
.flatMap(Function.identity())
.map(metadata -> metadata.getLastUpdated().toInstant()) //NPE
.orElse(null))
Run Code Online (Sandbox Code Playgroud)
但我得到了 NPE
.map(metadata -> metadata.getLastUpdated().toInstant())
Run Code Online (Sandbox Code Playgroud) java ×10
java-stream ×10
collections ×2
java-8 ×2
list ×2
arraylist ×1
arrays ×1
collectors ×1
grouping ×1
integer ×1
optional ×1