【问题标题】:How to convert the List<List<Object>> to List<List<String>> in Java?如何在 Java 中将 List<List<Object>> 转换为 List<List<String>>?
【发布时间】:2021-08-08 12:21:56
【问题描述】:

在我的 Spring Boot 项目中,我有两个类(实体和模型)

模型中有一个List&lt;List&lt;Object&gt;&gt;

public class FCSeriesModel {
    private String name;
    private List<List<Object>> values;
    //GET & SET 
}

在实体中有一个List&lt;List&lt;String&gt;&gt; (因为我不能使用List&lt;List&lt;Object&gt;&gt;):

    @Entity
    @Table(name = "Final_Feign_Client_Result")
    public class FinalFCResultEntity {
    
        @Id
        @Column(name = "id")
        @GeneratedValue(strategy = IDENTITY)
        private Integer id;
    
        @Column(name = "name")
        private String name;
    
        @ElementCollection
        @CollectionTable(name = "Final_Feign_Client_Result_Columns")
        @OnDelete(action = OnDeleteAction.CASCADE)
        @JoinColumn(name = "final_feign_client_result_entity_id", nullable = false)
        protected List<List<String>> values;
    
        // GET & SET
        }

如何转换 List&lt;List&lt;Object&gt;&gt;List&lt;List&lt;String&gt;&gt; 在服务类的方法中将模型的值发布到数据库中?

    @Transactional
    public FinalFCResultEntity postFinalFCResultEntity() throws Exception {
        final String methodName = "getAllMonterotondoMarittimoModelPstgrs()";
        try {
            this.startLog(methodName);
            String token = getToken();
            FinalFCResultModel FFCRM = feignClient.getAllObject(token);
            logger.info("Request Successful");
            logger.info("FeignClientResultModel:" + FFCRM.toString());

            List<FCResultModel> FCRMs = FFCRM.getResults();
            FinalFCResultEntity FFCRE = new FinalFCResultEntity();

            if (!FCRMs.isEmpty()) {
                for (FCResultModel currFCRM : FCRMs) {
                    for (FCSeriesModel currFCSM : currFCRM.getSeries()) {
                        FFCRE.setName(currFCSM.getName());  

                        //ADD setting FFCRE values?????

                        FinalFCResultEntity FFCREsaved = finalFCResultDao.save(FFCRE);
                    }
                }
            }
            this.endLog(methodName, FFCRE);
            return FFCRE;
        } catch (final Exception e) {
            logger.error(e.getMessage());
            this.errorLog(methodName, e);
            throw e;
        }
    } 

【问题讨论】:

    标签: java string list spring-boot


    【解决方案1】:

    这完全取决于一件事:List&lt;List&lt;Object&gt;&gt; 中的元素是否都是List&lt;String&gt;? 如果你知道它们是,你可以投射。

        @Test
        public void checkCasting() {
            List<List<Object>> objects = Arrays.asList(
                    Arrays.asList("This", "is", "an", "example"),
                    Arrays.asList("of", "a", "list", "of", "list"),
                    Arrays.asList("of", "strings", "and", "no", "other", "things"));
    
            @SuppressWarnings({"unchecked", "rawtypes"})
            List<List<String>> stringlist = (List<List<String>>) (List) objects;
            Assertions.assertEquals(objects, stringlist);
        }
    

    现在,这太糟糕了。您不能直接转换为List&lt;List&lt;String&gt;&gt;,因此您首先转换为原始列表,然后转换为您的字符串列表列表。只有当您 100% 绝对知道该列表中没有并且永远不会有任何非字符串实体时,这才是安全的。转换不会为您检查。它会在运行时静默失败。但是你不能太确定它什么时候会失败。

    因此,如果您不能保证这一点,则需要转换它们。最好的方法是创建将List&lt;Object&gt; 转换为List&lt;String&gt; 的东西,并在每个列表上调用该方法。 比如:

    List<String> convertToStringList(List<Object> objects) {
      List<String> out = new ArrayList<>();
      for(Object o : objects) {
        out.add(o.toString()); // or something more precise
      }
      return out;
    }
    
    List<List<String> convertToNestedListOfString(List<List<Object>> objectLists) {
     List<List<String>> out = new ArrayList<>();
     for(List<Object> objectList : objectLists) {
        out.add(convertToStringList(objectList));
     }
     return out;
    }
    

    简单的豌豆,柠檬汁。请记住,String 的 toString 方法只是返回自身,因此对于字符串来说这是一个微不足道的操作。但是,如果您希望它在对象不是字符串的情况下失败,请改为转换为字符串。或者检查内部列表的成员是否为 instanceof String,如果是这种情况,则抛出您自己的异常。由你决定。你仍然需要创建新的列表,所以这会比简单的演员阵容要慢,但至少你知道你得到了什么。我每次都会选择第二个选项,因为坦率地说,运行速度很快但给我错误结果(或一小时后爆炸)的代码在我的设置中对我来说不是很有用,而且我永远无法给出强大的铸造变体所需的保证。

    【讨论】:

      【解决方案2】:

      除了@Haakon Løtveit的回答。 使用 Java 8+ Stream API 的更优雅的方式:

      List<List<Object>> objects = ...
      
      List<List<String>> stringlist = objects.stream()
                      .map(it -> it.stream().map(Object::toString).collect(Collectors.toList()))
                      .collect(Collectors.toList());
      

      【讨论】:

      • 只做objects.stream().map(this::convertToStringList).collect(toList())不是更好吗?
      • @HaakonLøtveit 它需要声明方法convertToStringList。我的代码中没有 sn-p
      猜你喜欢
      • 2020-11-27
      • 1970-01-01
      • 1970-01-01
      • 2018-12-27
      • 1970-01-01
      • 2021-09-17
      • 2022-01-05
      • 1970-01-01
      相关资源
      最近更新 更多