【问题标题】:Why count of an iterable returns 1?为什么一个可迭代的计数返回 1?
【发布时间】:2020-08-08 15:41:55
【问题描述】:

这是 pom.xml

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-rest</artifactId>
    </dependency>

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

这是模型

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class WebsiteUser {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

private String name;
private String email;

public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}
}

这是用户存储库

@RepositoryRestResource(collectionResourceRel = "users", path = "users")
public interface UserRepository extends PagingAndSortingRepository<WebsiteUser, Long> {
List<WebsiteUser> findByName(@RequestParam("name") String name);
}

这是我的数据加载器:

@Component

公共类 DataLoader 实现 CommandLineRunner {

private static final Logger log = LogManager.getFormatterLogger(DataLoader.class);

private final UserRepository userRepository;

public DataLoader(UserRepository userRepository) {
    this.userRepository = userRepository;
}

@Override
public void run(String... args) throws Exception {

    Iterable<WebsiteUser> data = userRepository.findAll();

    long count = Stream.of(data).count();
    log.info("counted:" + count);
    log.info("data:" + data);

}
}

日志返回以下值:

计数:1

数据:[]

我不明白这个返回值。 [] 是空的,应该返回 0 而不是 1。你能解释一下为什么会这样吗?我怎样才能得到 0 而不是 1?

【问题讨论】:

  • 获取可迭代对象的确切大小:long count = data.spliterator().getExactSizeIfKnown();这将返回:count: 0

标签: java spring-boot spring-data-jpa


【解决方案1】:

你没有数据。

Stream.of(data) 生成一个迭代流。此流包含 1 个项目 (data),即空的可迭代对象,然后会尽职尽责地去:是的。 1 个空流。计数为 1。

通常你应该让集合自己变成流——无论 findAll 返回什么,它都比 Iterable 更具体,而且它可能有一个 stream() 方法。如果没有,您应该升级该依赖项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-11
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 2017-03-19
    • 2018-08-31
    • 2016-09-23
    相关资源
    最近更新 更多