java - java的lists.transform可以改变列表顺序吗?

标签 java list intellij-idea transform

我有一个单元测试来检查排序结果列表的顺序。

奇怪的是,测试总是在 intellij 中通过,但当我从控制台运行时总是失败 ./gradlew

是否transform或其他方法会根据环境的不同而发挥不同的作用?

public List<Image> sortImages(List<Image> inputImages, UserInfo userInfo) {
    if (inputImages == null) {
        return null;
    }
    List<ImageScore> imageScoreList = createImageScoreListFromImageList(inputImages);
    Collections.sort(imageScoreList, imageScoreDescComparator);
    imageScoreList = getSubListIfListIsTooLong(userInfo, imageScoreList);
    List<Image> sortedImages = transformImageScoreListToImageList(imageScoreList);
    return sortedImages;
}

private List<ImageScore> getSubListIfListIsTooLong(UserInfo userInfo, List<ImageScore> imageScoreList) {
    if (userInfo != null && userInfo.channel != null && userInfo.channel.equals(UserInfo.UserChannel.CLIENT)) {
        if (imageScoreList.size() > VenueConfig.s.MAX_IMAGES_TO_RETURN_TO_CLIENT) {
            imageScoreList = imageScoreList.subList(0, VenueConfig.s.MAX_IMAGES_TO_RETURN_TO_CLIENT);
        }
    }
    return imageScoreList;
}

private List<Image> transformImageScoreListToImageList(List<ImageScore> imageScoreList) {
    Collection result = Collections2.transform(imageScoreList, new Function<ImageScore, Image>() {
        @Override
        public Image apply(ImageScore input) {
            return input.image;
        }
    });

    return new ArrayList(result);
}

private List<ImageScore> createImageScoreListFromImageList(List<Image> inputImages) {
    Collection result = Collections2.transform(inputImages, new Function<Image, ImageScore>() {
        @Override
        public ImageScore apply(Image input) {
            ImageScore imageScore = new ImageScore(input);
            imageScore.score = imageScoreCalculator.getScoreForImage(input);
            return imageScore;
        }
    });
    return new ArrayList(result);
}

更新:

我执行以下逻辑:

1) 将 Image 转换为 ImageScore (使用元素 {int Score, Image image}) 这也设定了分数

2)然后我根据分数排序

3) 然后我将 ImageScore 重新转换为 Image

我怎样才能以不同的方式做到这一点?作为计算分数的排序中继?

最佳答案

是的,很可能就是这样。

transform 返回一个Collection(根据定义,该集合未排序),并且在其文档中不提供有关排序的保证。

它似乎总是排序的,但这取决于实现,您不应该依赖任何东西。

如果您的元素有逻辑顺序,您可以尝试以下操作:

Collections.sort(result);
return new ArrayList(result);

否则,您可以使用某种辅助函数来测试两个列表的等价性,而无需注意顺序。

关于java - java的lists.transform可以改变列表顺序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25990014/

相关文章:

java - 是否可以在 iOS、Android 或 Windows Phone 8 上运行 JavaFX 应用程序?

java - 接受 0.5 和整数的正则表达式

python - 从字符串列表中提取 8 位数字

intellij-idea - 使用 PhpStorm 和 WebStorm 时出现问题

java - 如何停止在 IntelliJ 中运行的进程以调用关闭 Hook ?

intellij-idea - 如何使用IntelliJ Live Template 内部?

java - json 中的 JDBC Prepared 语句参数

java - Java azure中while循环输出不同结果的打印结果

list - Shapeless、Scala 中的过滤器使用

list - 如何理解scala中的List::map声明?