Java 如何平面映射自定义创建的类?
我不熟悉Java(特别是Java-8风格),我正在尝试获取一个包含围绕其他坐标的坐标的列表。最好用一个例子来说明 我定义了一个自定义类,它是一个坐标,如下所示:Java 如何平面映射自定义创建的类?,java,java-stream,Java,Java Stream,我不熟悉Java(特别是Java-8风格),我正在尝试获取一个包含围绕其他坐标的坐标的列表。最好用一个例子来说明 我定义了一个自定义类,它是一个坐标,如下所示: public class Coord { public final int row; public final int col; public Coord(int row, int col) { this.row = row; this.col = col; }
public class Coord {
public final int row;
public final int col;
public Coord(int row, int col) {
this.row = row;
this.col = col;
}
public List<Coord> surroundingCoordinates() {
return Arrays.asList(
// Up & down
new Coord(row + 1, col), new Coord(row - 1, col),
// Left and right
new Coord(row, col + 1), new Coord(row, col - 1),
// Diagonals
new Coord(row - 1, col - 1), new Coord(row - 1, col + 1),
new Coord(row + 1, col - 1), new Coord(row + 1, col + 1)
);
}
public static List<Coord> surround(Coord c) {
return Arrays.asList(
// Up & down
new Coord(c.row + 1, c.col), new Coord(c.row - 1, c.col),
// Left and right
new Coord(c.row, c.col + 1), new Coord(c.row, c.col - 1),
// Diagonals
new Coord(c.row - 1, c.col - 1), new Coord(c.row - 1, c.col + 1),
new Coord(c.row + 1, c.col - 1), new Coord(c.row + 1, c.col + 1)
);
}
}
public static Stream<Coord> getSurroundingCoordinates(Coord[] coordinates) {
// Turn the array of coordinates into a List
List<Coord> coordsList = Arrays.asList(coordinates);
// Trying to map and then flatten (fails)
return coordsList.stream().flatMap(Coord::surroundingCoordinates);
}
公共类协作{
公共最终int行;
公共最终信息;
公共合作社(国际行、国际列){
this.row=行;
this.col=col;
}
公共列表环绕坐标(){
返回数组.asList(
//上下
新坐标(第1行,第2列),新坐标(第1行,第2列),
//左右
新坐标(世界其他地区,第1列),新坐标(世界其他地区,第1列),
//对角线
新合作社(第1行,第1列),新合作社(第1行,第1列+1),
新合作社(第1行,第1列),新合作社(第1行,第1列)
);
}
公共静态列表环绕(Coord c){
返回数组.asList(
//上下
新合作社(c.row+1,c.col),新合作社(c.row-1,c.col),
//左右
新合作社(中央银行,中央银行+1),新合作社(中央银行,中央银行-1),
//对角线
新合作社(c.row-1,c.col-1),新合作社(c.row-1,c.col+1),
新合作社(c.row+1,c.col-1),新合作社(c.row+1,c.col+1)
);
}
}
我试图构建一个函数(静态方法),它遍历一组坐标,并生成一个包含所有周围坐标的扁平列表。换句话说,我想将一个函数映射到一个坐标列表,然后将结果展平,得到一个坐标列表。我的函数如下所示:
public class Coord {
public final int row;
public final int col;
public Coord(int row, int col) {
this.row = row;
this.col = col;
}
public List<Coord> surroundingCoordinates() {
return Arrays.asList(
// Up & down
new Coord(row + 1, col), new Coord(row - 1, col),
// Left and right
new Coord(row, col + 1), new Coord(row, col - 1),
// Diagonals
new Coord(row - 1, col - 1), new Coord(row - 1, col + 1),
new Coord(row + 1, col - 1), new Coord(row + 1, col + 1)
);
}
public static List<Coord> surround(Coord c) {
return Arrays.asList(
// Up & down
new Coord(c.row + 1, c.col), new Coord(c.row - 1, c.col),
// Left and right
new Coord(c.row, c.col + 1), new Coord(c.row, c.col - 1),
// Diagonals
new Coord(c.row - 1, c.col - 1), new Coord(c.row - 1, c.col + 1),
new Coord(c.row + 1, c.col - 1), new Coord(c.row + 1, c.col + 1)
);
}
}
public static Stream<Coord> getSurroundingCoordinates(Coord[] coordinates) {
// Turn the array of coordinates into a List
List<Coord> coordsList = Arrays.asList(coordinates);
// Trying to map and then flatten (fails)
return coordsList.stream().flatMap(Coord::surroundingCoordinates);
}
公共静态流getSurroundingCoordinates(坐标[]){
//将坐标数组转换为列表
List coordsList=Arrays.asList(坐标);
//尝试映射然后展平(失败)
返回coordsList.stream().flatMap(Coord::surroundingCoordinates);
}
我遇到IDE编译错误(在coord::surroundingCoordinates处):
所需类型:函数
提供:
因此,我尝试使用静态方法而不是方法,如:
public static Stream<Coord> getSurroundingCoordinates(Coord[] coordinates) {
// Turn the array of coordinates into a List
List<Coord> coordsList = Arrays.asList(coordinates);
// Trying to map and then flatten (fails)
return coordsList.stream().flatMap(c -> Coord.surround(c));
}
公共静态流getSurroundingCoordinates(坐标[]){
//将坐标数组转换为列表
List coordsList=Arrays.asList(坐标);
//尝试映射然后展平(失败)
返回coordsList.stream().flatMap(c->Coord.round(c));
}
我在c->Coord.surround(c)中遇到IDE编译错误:
所需类型:列表
提供:溪流
我所追求的最终结果是一个坐标的平面集合我想你只是语法有点错误:
public static Stream<Coord> getSurroundingCoordinates(Coord[] coordinates) {
return Arrays.stream(coordinates).flatMap(c -> c.surroundingCoordinates().stream());
}
公共静态流getSurroundingCoordinates(坐标[]){
返回Arrays.stream(coordinates.flatMap(c->c.surroundingCoordinates().stream());
}
我猜您只是语法有点错误:
public static Stream<Coord> getSurroundingCoordinates(Coord[] coordinates) {
return Arrays.stream(coordinates).flatMap(c -> c.surroundingCoordinates().stream());
}
公共静态流getSurroundingCoordinates(坐标[]){
返回Arrays.stream(coordinates.flatMap(c->c.surroundingCoordinates().stream());
}
在这种情况下,即使出于性能原因,也最好让环绕方法返回流而不是列表。就这样做吧:
class Coord {
public static Stream<Coord> surround(Coord c) {
return Stream.of(
new Coord(c.row + 1, c.col), new Coord(c.row - 1, c.col),
new Coord(c.row, c.col + 1), new Coord(c.row, c.col - 1),
new Coord(c.row - 1, c.col - 1), new Coord(c.row - 1, c.col + 1),
new Coord(c.row + 1, c.col - 1), new Coord(c.row + 1, c.col + 1)
);
}
public static Stream<Coord> getSurroundingCoordinates(Coord[] coordinates) {
List<Coord> coordsList = Arrays.asList(coordinates);
return coordsList.stream().flatMap(Coord::surround);
}}
在这种情况下,即使出于性能原因,也最好让环绕方法返回流而不是列表。就这样做吧:
class Coord {
public static Stream<Coord> surround(Coord c) {
return Stream.of(
new Coord(c.row + 1, c.col), new Coord(c.row - 1, c.col),
new Coord(c.row, c.col + 1), new Coord(c.row, c.col - 1),
new Coord(c.row - 1, c.col - 1), new Coord(c.row - 1, c.col + 1),
new Coord(c.row + 1, c.col - 1), new Coord(c.row + 1, c.col + 1)
);
}
public static Stream<Coord> getSurroundingCoordinates(Coord[] coordinates) {
List<Coord> coordsList = Arrays.asList(coordinates);
return coordsList.stream().flatMap(Coord::surround);
}}
flatMap
返回一个流,而不是列表(正如您的方法所期望的那样)。只需添加.flatMap(…).collect(Collectors.toList())
Hi@Eugene。我纠正了我的方法。我仍然会犯同样的错误。我应该在哪里添加代码段?“我需要收集吗?我遇到了一个错误——我们应该猜猜是哪里发生的吗?”尤金。我更新了我的问题。如果仍不清楚,请告知我flatMap
是否返回流,而不是列表(如您的方法所期望的那样)。只需添加.flatMap(…).collect(Collectors.toList())
Hi@Eugene。我纠正了我的方法。我仍然会犯同样的错误。我应该在哪里添加代码段?“我需要收集吗?我遇到了一个错误——我们应该猜猜是哪里发生的吗?”尤金。我更新了我的问题。如果还不清楚,请告诉我