Java 用流打印列表

Java 用流打印列表,java,java-stream,Java,Java Stream,我正在尝试打印一个列表,它表示数据库中的行 当我尝试用流打印列表时,它会打印出我认为是项目位置的内容 这就是我所看到的输出: BLL。Teacher@6d9c638 BLL。Teacher@7dc5e7b4 进程已完成,退出代码为0 这些输出中的每一个都是数据库中的一行,因为当我添加另一行时,会向其中添加一个额外的输出 这是给出上述输出的代码: public class Main { public static void main(String[] args) { try {

我正在尝试打印一个列表,它表示数据库中的行 当我尝试用流打印列表时,它会打印出我认为是项目位置的内容

这就是我所看到的输出:

BLL。Teacher@6d9c638

BLL。Teacher@7dc5e7b4

进程已完成,退出代码为0

这些输出中的每一个都是数据库中的一行,因为当我添加另一行时,会向其中添加一个额外的输出

这是给出上述输出的代码:

public class Main {
public static void main(String[] args) {
    try {
        Controller.getAlleTeachers()
                .stream()
                .forEach(System.out::println);
    } catch (IOException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
}
当我向它添加map函数时,它会给出正确的输出

public class Main {
public static void main(String[] args) {
    try {
        Controller.getAlleTeachers()
                .stream()
                .map(m->m.getFirstName())
                .forEach(System.out::println);
    } catch (IOException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
}
所以上面的代码确实输出了数据库中行的名字 另外,当我使用foreach打印列表时,输出是正确的:

public class Main {
public static void main(String[] args) {
    try {
        for (Teacher t: Controller.getAlleTeachers()
             ) {
            System.out.println(t.getFirstName() + " " +
                               t.getLastName() + " " +
                               t.getCourse() + " " +
                               t.getStartDate());
        }
    } catch (IOException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
}
所以代码的最后一部分也输出了所有正确的信息,
所以我知道问题不在于连接数据库或访问数据,甚至不在于传递数据的方法。所以我想一定是溪流造成的?使用streams时,我为什么会得到如此奇怪的输出?

区别在于lambda表达式使用对象的toString(),for-each循环使用字段的值。你可以把

System.out.println(t.getFirstName() + " " +
                               t.getLastName() + " " +
                               t.getCourse() + " " +
                               t.getStartDate());

在lambda表达式中

尝试打印教师实例时;调用该对象的toString()方法。由于您尚未重写toString(),因此将打印默认的toString()。BLL。Teacher@6d9c638

如果我没记错,@后面的十六进制值是对象的内存位置

长话短说尝试实现 公共字符串toString(){返回this.name+..字段的其余部分;}
在教师对象上

看起来您没有在教师类中重写toString()方法BLL。Teacher@6d9c638BLL。Teacher@7dc5e7b4-这些是对象的引用(默认为toString()输出)。尝试重写toString()方法。

如果@efekActive语句为true,则重写toString方法。类似于:return fName+“”+lName+…您的问题与MySQL或JDBC无关,因此我删除了这些标记。这就成功了,tnx