使用java8流api时类型丢失

使用java8流api时类型丢失,java,java-8,java-stream,Java,Java 8,Java Stream,代码优先: net.sf.json.JSONArray ja = new net.sf.json.JSONArray(); for (int i = 0; i < 3; i++) { net.sf.json.JSONObject obj = new net.sf.json.JSONObject(); obj.put("number", "k"+i); ja.add(obj); } System.out.prin

代码优先:

    net.sf.json.JSONArray ja = new net.sf.json.JSONArray();
    for (int i = 0; i < 3; i++) {
        net.sf.json.JSONObject obj = new net.sf.json.JSONObject();
        obj.put("number", "k"+i);
        ja.add(obj);
    }
    System.out.println(ja.stream().map(s->((net.sf.json.JSONObject)s).getString("number")).peek(s->System.out.println(s.getClass())).collect(Collectors.joining(";")));
但是
ja.stream().map(s->((JSONObject)s).getString(“number”)
似乎返回的不是
流,而是
流,我无法附加
String
这样的中间操作,比如
.map(s->s.substring(3))
。换句话说,输入丢失


那么,有人能提供一些建议吗?

分解您的流语句确实会导致:

net.sf.json.JSONArray ja = new net.sf.json.JSONArray();
Stream stream1 = ja.stream();
Stream stream2 = stream1.map(s -> ((JSONObject) s).getString("number"));
如您所见,
stream1
不是泛型类型。因此,任何转换都不会从非泛型类型生成泛型类型。将变量
ja
或变量
stream1
更改为泛型类型将导致变量
stream2

net.sf.json.JSONArray ja = new net.sf.json.JSONArray();
Stream<Object> stream1 = ja.stream();
Stream<String> stream2 = stream1.map(s -> ((JSONObject) s).getString("number"));
net.sf.json.JSONArray ja=new net.sf.json.JSONArray();
Stream stream1=ja.Stream();
streamstream2=stream1.map(s->((JSONObject)s).getString(“number”);

因此,如果您想要保留类型信息,您需要一个可以携带它的泛型类型。

JSONArray
实现原始类型。它会毒死你的整个河流。使用通用的
列表
net.sf.json.JSONArray ja = new net.sf.json.JSONArray();
Stream<Object> stream1 = ja.stream();
Stream<String> stream2 = stream1.map(s -> ((JSONObject) s).getString("number"));