如何在Java8中访问嵌套流中的单个对象流



给定一个整数对列表(为了简化问题并避免Java中的Pair数据结构,我们将使用列表(,如何操作其中的单个整数?

例如,我已经通过坐标(x,y(加载了n个点。

List<List<Integer>> numbers;
Scanner sc = new Scanner(System.in);                
int x = sc.nextInt();
int y = sc.nextInt();
numbers.add(Arrays.asList(x,y));
sc.close();

现在我想将它们转换为流,并检查坐标x和y是否都满足x*y < 0

我尝试过使用flatmap,但无法将内部列表转换为流

Java是标称的,就像在中一样,它喜欢事物的名称。

你在与语言作斗争。别那样做了。顺其自然。

List<Integer>确实可以用来表示一个点,但它真的很糟糕。它打印得不好,而且制作一个"无效状态"对象也很琐碎——List.of(),那是什么坐标?List.of(1, 2, 3),那里发生了什么事?

制作一个表示二维点概念的类。

public record Point(int x, int y) {}

会这么做的,对exmaple来说。

但是,假设你想一直朝自己的脚开枪,并滥用List<Integer>作为坐标对,那么你就不想要平面图了。

例如,给定原点坐标((0, 0)(,以及x=5和y=10,那么flatMap将使您获得一个仅为序列0, 0, 5, 10的流。这是而不是好的流通过让您检查和操作单个项目来工作。此时无法检查x * y

所以,你不想要平面图。您只需要对numbers.stream()进行操作,它是一个List<Integer>对象流。然后,您可以将逻辑应用于这些对象中的每一个,这只是表示2D坐标的一种非常糟糕的方式。

numbers.stream().anyMatch(list -> list.get(0) * list.get(1) < 0);

您可以将内部列表转换为流,但平面图用于压平列表。它会给你一个元素,而不是一对。

List<Integer> list = numbers.stream().flatMap(point -> point.stream()).filter(x -> x>0).collect(Collectors.toList());

刚才你问了一个问题。当我写完答案回来时,你的问题已经结束了。我必须回答你刚才在这个问题下提出的问题。

package lambda;
import java.util.*;
import static java.util.stream.Collectors.*;
/**
* @Author: Beer Bear
* @Description: todo
* @Date: 2021/6/29 10:41
*/
public class stackoverflow {
public static void main(String[] args) {
List<Integer> list1 = Arrays.asList(1,2);
List<Integer> list2 = Arrays.asList(-1,2);
List<Integer> list3 = Arrays.asList(1,100);
List<List<Integer>> numbers = new LinkedList();
numbers.add(list1);
numbers.add(list2);
numbers.add(list3);
//System.out.println(allList);
Map<Boolean, List<Integer>> map = numbers.stream().collect(groupingBy(list -> list.get(0) * list.get(1) > 0, mapping(list -> function(list.get(0), list.get(1)), toList())));
System.out.println(map);
int sumOfCase1 = map.get(true).stream().mapToInt(item -> item).sum();
int sumOfCase2 = map.get(false).stream().mapToInt(item -> item).sum();
System.out.println(sumOfCase1+" "+sumOfCase2);
}
private static int function(int a, int b){
return a+b;
}
}

相关内容

最新更新