给定一个整数对列表(为了简化问题并避免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;
}
}