Java - 具有多级类的列表集合 - 仅循环最后一个成员 - .stream() .forEach() .for()

标签 java class object collections java-stream

我有一个问题让我昨晚睡了太久:) 我制作了一个多级类(class),例如:

  • 图层
    • 图层图像
    • 半色调图层
      • 图层半色调视频
      • 图层半色调图像

方法

  • 对象是在settings.java中创建的
  • 并添加到“图层”集合列表中。
  • 在 main.java 中,我尝试通过 3 种方式聚合它们。

问题

所有聚合都不起作用(读取:给出所需的结果)它们都只循环集合列表的最后一个成员。

我的问题是,我哪里出错了?我需要更改什么才能使其正常工作?

很抱歉代码太长。我已尝试使该插图尽可能紧凑。

控制台结果

5
[LayerHalftoneVideo@61bbe9ba, LayerHalftoneVideo@610455d6, LayerHalftoneVideo@511d50c0, LayerHalftoneImage@60e53b93, LayerImage@5e2de80c]
LayerHalftoneVideo@511d50c0
title 01

.forEach()
title 01
title 01
title 01
title 01
title 01

.stream()
title 01
title 01
title 01
title 01
title 01

.for()
title 01
title 01
title 01
title 01
title 01

控制台期望结果

(对于每种循环类型)

smoke
video 01
video 02
image 01
title 01

ma​​in.java

public class main {

    public static void main(String[] args) {

        // debug to see amount of elements in list
        System.out.println( settings.layers.size() );
        System.out.println( settings.layers );
        System.out.println( settings.layers.get(2) );
        System.out.println( settings.layers.get(2).idReadable );

        System.out.println( "\n.forEach() ");
        settings.layers.forEach( layer -> {
            System.out.println( layer.idReadable);
        });

        System.out.println( "\n.stream() ");
        settings.layers
                .stream()
                .forEach( layer -> {
                    System.out.println( layer.idReadable);
                });

        System.out.println( "\n.for() ");
        for (Layer layer : settings.layers) {
            System.out.println( layer.idReadable );
        }
    }
}

settings.java

import java.util.ArrayList;
import java.util.List;

public class settings extends main {

    public static List<Layer> layers = new ArrayList<>();

    static {

        layers.add(new LayerHalftoneVideo(
                "smoke",
                false,
                "video/smoke_02.mp4",
                1000,
                1414,
                1,
                0,
                30,
                50,
                0,
                new int[] { 255,255,255 },//color_03,
                30,
                1.0f
        ));

        layers.add(new LayerHalftoneVideo(
                "video 01",
                true,
                "video/01.mp4",
                1000,
                1414,
                1,
                0,
                40,
                80,
                1,
                new int[] { 255,255,255 },//color_02,
                30,
                1.0f
        ));

        layers.add(new LayerHalftoneVideo(
                "video 02",
                true,
                "video/02.mp4",
                1000,
                1414,
                1,
                0,
                0,
                100,
                1,
                new int[] { 255,255,255 },//color_00,
                30,
                1.0f
        ));

        layers.add(new LayerHalftoneImage(
                "image 01",
                false,
                "illustration/1.jpg",
                1000,
                1414,
                1,
                0,
                20,
                80,
                1,
                new int[] { 255,255,255 }//color_02
        ));

        layers.add(new LayerImage(
                "title 01",
                true,
                "image/title_01.png"
        ));

    }
}

Layer.java

public abstract class Layer {

    static String    idReadable;
    static boolean   runThisLayer;
    static String    inputPath;

    public Layer(
            String  _idReadable,
            boolean _runThisLayer,
            String  _inputPath
    ) {
        idReadable      = _idReadable;
        runThisLayer    = _runThisLayer;
        inputPath       = _inputPath;
    }

}

LayerImage.java

public class LayerImage extends Layer {

    public LayerImage(
            String  _idReadable,
            boolean _runThisLayer,
            String  _inputPath
    ) {
        super(
                _idReadable,
                _runThisLayer,
                _inputPath
        );
    }

}

LayerHalftone.java

public class LayerHalftone extends Layer {

    static int       inputWidth;
    static int       inputHeight;
    static int       patternOffset;
    static int       patternSkipEach;
    static int       patternAngleRadian;
    static int       patternBlockAmount;
    static int       patternNumber;
    static int[]     patternColor;

    public LayerHalftone(
            String  _idReadable,
            boolean _runThisLayer,
            String  _inputPath,
            int     _inputWidth,
            int     _inputHeight,
            int     _patternOffset,
            int     _patternSkipEach,
            int     _patternAngleRadian,
            int     _patternBlockAmount,
            int     _patternNumber,
            int[]   _patternColor
    ) {
        super(
                _idReadable,
                _runThisLayer,
                _inputPath
        );

        inputWidth          = _inputWidth;
        inputHeight         = _inputHeight;
        patternOffset       = _patternOffset;
        patternSkipEach     = _patternSkipEach;
        patternAngleRadian  = _patternAngleRadian;
        patternBlockAmount  = _patternBlockAmount;
        patternNumber       = _patternNumber;
        patternColor        = _patternColor;
    }
}

LayerHalftoneVideo.java

public class LayerHalftoneVideo extends LayerHalftone {

    public static int       videoTimeStart;
    public static float     videoTimeSpeed;

    public LayerHalftoneVideo(
            String  _idReadable,
            boolean _runThisLayer,
            String  _inputPath,
            int     _inputWidth,
            int     _inputHeight,
            int     _patternOffset,
            int     _patternSkipEach,
            int     _patternAngleRadian,
            int     _patternBlockAmount,
            int     _patternNumber,
            int[]   _patternColor,
            int     _videoTimeStart,
            float   _videoTimeSpeed
    ) {
        super(
                _idReadable,
                _runThisLayer,
                _inputPath,
                _inputWidth,
                _inputHeight,
                _patternOffset,
                _patternSkipEach,
                _patternAngleRadian,
                _patternBlockAmount,
                _patternNumber,
                _patternColor
        );

        videoTimeStart  = _videoTimeStart;
        videoTimeSpeed  = _videoTimeSpeed;
    }

}

LayerHalftoneImage.java

public class LayerHalftoneImage extends LayerHalftone {

    public LayerHalftoneImage(
            String  _idReadable,
            boolean _runThisLayer,
            String  _inputPath,
            int     _inputWidth,
            int     _inputHeight,
            int     _patternOffset,
            int     _patternSkipEach,
            int     _patternAngleRadian,
            int     _patternBlockAmount,
            int     _patternNumber,
            int[]   _patternColor
    ) {
        super(
                _idReadable,
                _runThisLayer,
                _inputPath,
                _inputWidth,
                _inputHeight,
                _patternOffset,
                _patternSkipEach,
                _patternAngleRadian,
                _patternBlockAmount,
                _patternNumber,
                _patternColor
        );
    }

}

最佳答案

如果你看看你的Layer及其子类:

public abstract class Layer {

    static String    idReadable;
    static boolean   runThisLayer;
    static String    inputPath;
    ...
}

您会看到它们都有静态字段。这些字段属于该类,而不属于您创建的类的实例。因此,您创建的不同层将不会具有独立的 idReadablerunThisLayerinputPath。每次创建新层时,这些字段都会重置,这就是为什么它们只包含您创建的最后一层的值。

要解决此问题,只需将它们设置为非静态即可:

public abstract class Layer {

    String    idReadable;
    boolean   runThisLayer;
    String    inputPath;
    ...
}

您还应该考虑将它们设为私有(private)并使用 getter 来获取它们的值。

关于Java - 具有多级类的列表集合 - 仅循环最后一个成员 - .stream() .forEach() .for(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58518475/

相关文章:

c++ - 有目的地多次链接同一个对象时,如何避免多个定义错误?

Java:在运行时检查类是否存在

firebase - 如何在 flutter 中按日期将数据从 firestore 排序到 map

java - android:如何从链接获取数据并读取它

java - 从/assets/filename 公钥加载 X509Certificate 不正确

c++ - 访问同一源文件中另一个 .cpp 的成员函数?

jquery IE8 $(document).ready "object expected"错误

javascript - 从对象数组到对象

java - 从 Java 字节码构建解析树/AST

java - 在java中设计GUI组件的方法