Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何平面映射自定义创建的类?_Java_Java Stream - Fatal编程技术网

Java 如何平面映射自定义创建的类?

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; }

我不熟悉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 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。我纠正了我的方法。我仍然会犯同样的错误。我应该在哪里添加代码段?“我需要收集吗?我遇到了一个错误——我们应该猜猜是哪里发生的吗?”尤金。我更新了我的问题。如果还不清楚,请告诉我