无法将数组列表中的元素转换为字符串



我正试图编写一个getMessageList方法,将消息列表转换为字符串并返回它。但是,toString方法实际上并没有将列表的成员转换为字符串。

Main.java

import java.util.ArrayList;
import java.util.List;;
public class Main {
public static void main(String[] args) {
List<LogMessage> ln = new ArrayList <LogMessage>();
ln.add(new LogMessage("SERVER1:file not found"));
ln.add(new LogMessage("SERVER2:disk"));
ln.add(new LogMessage("SERVER3:not found disk"));
ln.add(new LogMessage("SERVER4:disk/found"));
ln.add(new LogMessage("SERVER5:Disk found"));
ln.add(new LogMessage("SERVER6:no/disk found"));
ln.add(new LogMessage("SERVER7:no disk/found"));
ln.add(new LogMessage("SERVER8:no disk found"));
ln.add(new LogMessage("SERVER9:not found/disk"));
ln.add(new LogMessage("SERVER10:not found disk"));
for(LogMessage lnsg : ln) {
System.out.println(lnsg.getDescription() + " => " + lnsg.getmachineId());
System.out.println("containsWord = " + lnsg.containsWord("disk"));
}

SystemLog s1 = new SystemLog(ln);
System.out.println( s1.getMessageList(ln));
System.out.println("messageList Size: " + s1.getMessageList(ln).length);
System.out.println("remove list " + s1.removeMessages("disk"));
System.out.println("message List " + s1.getMessageList(ln));
System.out.println("messageList Size: " + s1.getMessageList(ln).length);
}
}

MygetMessageList:

public String[] getMessageList(List a) {
String[] messagelist = new String[a.size()];

for(int i = 0; i < a.size();i++) {
System.out.println("a.get(i): " + a.get(i)); //test
System.out.println("a.get(i).toString: " + a.get(i).toString()); //test
messagelist[i] = a.get(i).toString();
}
return messagelist;
}

输出
a.get(i): LogMessage@33909752
a.get(i).toString: LogMessage@33909752
a.get(i): LogMessage@55f96302
a.get(i).toString: LogMessage@55f96302
a.get(i): LogMessage@3d4eac69
a.get(i).toString: LogMessage@3d4eac69
a.get(i): LogMessage@42a57993
a.get(i).toString: LogMessage@42a57993
a.get(i): LogMessage@75b84c92
a.get(i).toString: LogMessage@75b84c92
a.get(i): LogMessage@6bc7c054
a.get(i).toString: LogMessage@6bc7c054
a.get(i): LogMessage@232204a1
a.get(i).toString: LogMessage@232204a1
a.get(i): LogMessage@4aa298b7
a.get(i).toString: LogMessage@4aa298b7
a.get(i): LogMessage@7d4991ad
a.get(i).toString: LogMessage@7d4991ad
a.get(i): LogMessage@28d93b30
a.get(i).toString: LogMessage@28d93b30
[Ljava.lang.String;@1b6d3586
a.get(i): LogMessage@33909752
a.get(i).toString: LogMessage@33909752
a.get(i): LogMessage@55f96302
a.get(i).toString: LogMessage@55f96302
a.get(i): LogMessage@3d4eac69
a.get(i).toString: LogMessage@3d4eac69
a.get(i): LogMessage@42a57993
a.get(i).toString: LogMessage@42a57993
a.get(i): LogMessage@75b84c92
a.get(i).toString: LogMessage@75b84c92
a.get(i): LogMessage@6bc7c054
a.get(i).toString: LogMessage@6bc7c054
a.get(i): LogMessage@232204a1
a.get(i).toString: LogMessage@232204a1
a.get(i): LogMessage@4aa298b7
a.get(i).toString: LogMessage@4aa298b7
a.get(i): LogMessage@7d4991ad
a.get(i).toString: LogMessage@7d4991ad
a.get(i): LogMessage@28d93b30
a.get(i).toString: LogMessage@28d93b30
messageList Size: 10
remove list [LogMessage@55f96302, LogMessage@3d4eac69, LogMessage@42a57993, LogMessage@6bc7c054, LogMessage@232204a1, LogMessage@4aa298b7, LogMessage@7d4991ad, LogMessage@28d93b30]
a.get(i): LogMessage@33909752
a.get(i).toString: LogMessage@33909752
a.get(i): LogMessage@75b84c92
a.get(i).toString: LogMessage@75b84c92
message List [Ljava.lang.String;@4554617c
a.get(i): LogMessage@33909752
a.get(i).toString: LogMessage@33909752
a.get(i): LogMessage@75b84c92
a.get(i).toString: LogMessage@75b84c92
messageList Size: 2

toString

需要文本表示的自定义(甚至库提供的)对象必须覆盖从Object类继承的toString()

当前例子假设列表被引用为List<LogMessage>并且LogMessage已经覆盖了toString,下面的代码将返回String数组

public String[] getMessageList(List<LogMessage> list) {
return list.stream().map(e -> e.toString()).toArray(String[]::new);
}

或者即使您需要一个泛型方法(假设该类型覆盖了toString),那么

String[] getAsStringArray(List<T> list) {
return list.stream().map(e -> e.toString()).toArray(String[]::new);
}

或者,如果输入可以包含null并且可以是任何类型,

String[] getAsStringArray(List<?> list) {
return list.stream().filter(Objects::nonNull).map(e -> e.toString()).toArray(String[]::new);
}

或者,如果它是一个公共接口并且列表本身可以为空,

public String[] getAsStringArray(List<?> list) {
if (list == null) {
return new String[0];
}
return list.stream().filter(Objects::nonNull).map(e -> e.toString()).toArray(String[]::new);
}

不重写toString,toString将使用Object.toString

最新更新