使用流通过存储库接口[保留]过滤List来生成集合

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (7)

像这个删除的问题,我想定义一个存储库(接口和具体类),CollectionList使用流生成一个。流应过滤掉一些元素,例如按姓氏选择人物对象,或按物种选择动物对象。所有这些应该使用泛型类型安全的

我收到一个错误: Collection cannot be resolved to a type

也许有人在乎提供一个小例子。

提问于
用户回答回答于

是的,你肯定能产生ListArrayList在具体的类,而返回的更普遍Collection

这是一个完整的例子。

存储库的接口,Repository

package work.basil.example;

import java.util.Collection;

public interface Repository
{
    Collection < Animal > fetchAnimalsBySpecies ( String species );
}

该接口的具体实现是我们的类BogusRepository。对于这个例子,我们在实例化这个类时定义了几只狗和几只猫。

package work.basil.example;

import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;

public class BogusRepository implements Repository
{
    private List < Animal > animals = List.of( new Animal( "dog" , "Oliver" ) , new Animal( "cat" , "Jemma" ) , new Animal( "cat" , "Lilly Mae" ) , new Animal( "dog" , "Cocoa" ) );

    @Override
    public Collection < Animal > fetchAnimalsBySpecies ( String species )
    {
        List < Animal > c = 
            this.animals
                    .stream()
                    .filter( a -> a.getSpecies().equalsIgnoreCase( "dog" ) )
                    .collect( Collectors.toList() )
        ;
        return c;
    }
}

该存储库正在处理我们的POJO业务类的对象Animal。这个简单的类有一对字符串,用于物种和名称。

在实际工作中,我会使用enum作为物种。但这与这个简单的例子无关。

package work.basil.example;

import java.util.Objects;
import java.util.StringJoiner;

public class Animal
{
    // Member variables.
    private String species, name;

    // Constructor
    public Animal ( String species , String name )
    {
        Objects.requireNonNull( species );
        Objects.requireNonNull( name );
        this.species = species;
        this.name = name;
    }

    // Accessors, getter-methods.

    public String getSpecies ()
    {
        return species;
    }

    public String getName ()
    {
        return name;
    }

    // `Object` overrides.

    @Override
    public String toString ()
    {
        return new StringJoiner( " | " , Animal.class.getSimpleName() + "{ " , " }" )
                .add( "species='" + species + "'" )
                .add( "name='" + name + "'" )
                .toString();
    }

    @Override
    public boolean equals ( Object o )
    {
        if ( this == o ) return true;
        if ( o == null || getClass() != o.getClass() ) return false;
        Animal animal = ( Animal ) o;
        return getSpecies().equals( animal.getSpecies() ) &&
                getName().equals( animal.getName() );
    }

    @Override
    public int hashCode ()
    {
        return Objects.hash( getSpecies() , getName() );
    }
}

请注意,存储库接口和类都只引用更通用Collection< Animal >的返回类型。同时该fetchAnimalsBySpecies方法中的实现代码与方法List< Animal >实现的接口一起工作List.of

使用的实际类List.of是未记录的,这就是重点:我们不关心具体的类。我们可以很好地用来new ArrayList<>()代替List.of

无论哪种方式,我们都将对象跟踪为更通用的List界面。然后我们过滤该列表的流以产生另一个List。最后,我们将流式过滤返回List为更一般Collection。它都是强类型和类型安全的,它的工作原理。尝试使用这个App类的main方法。

package work.basil.example;

import java.util.Collection;

public class App
{
    public static void main ( String[] args )
    {
        App app = new App() ;
        app.demo();
    }

    private void demo ()
    {
        Repository r = new BogusRepository();
        Collection <Animal> dogs = r.fetchAnimalsBySpecies( "dog" );

        System.out.println("dogs: " + dogs );
    }
}

狗:[动物{species ='狗'| name ='Oliver'},Animal {species ='dog'| name ='Cocoa'}]

热门问答

关于web表情包集成?

最爱开车啦互联网的敏感者
推荐
表情使用方式有两种方式: 1)是使用 TIMFaceElem 中的 index,标识表情的索引,比如 Android 和 iOS 两端都有同一套表情图,索引2为笑脸,index=2 就表示笑脸,两端发送和接收都显示同一张索引表情图片即可。 2 ) 是使用 TIMFaceElem ...... 展开详请

如何将本地的.json格式的文件部署到服务器上, 通过url请求?

使用 CDS-Mask 做数据合作,怎么确保双方都不能反推对方的 ID?

用户2134289

腾讯科技 · 高级工程师 (已认证)

推荐
您好,两种方案可以解决您的需求 1)如果您这边ID不需要在业务上使用,将ID进行加星脱敏即可,加星后的所有数据字符将变为*,无法还原; 2)如果您这边ID在业务上需要使用,也就是ID在处理后必须保持唯一性,那么需要采用腾讯数港算法解决该问题,数港算法目前灰度中,如需要申请,烦请通...... 展开详请

cos.sliceUploadFile支持断点续传吗?

如果用的是 cos-js-sdk,那么 cos.restartTask 是会断点续传的,用法没有问题。 PS: sdk 使用可以参考 demo.js https://github.com/tencentyun/cos-js-sdk-v5/blob/master/demo/demo...... 展开详请

如何调整版本库大小?

marssun_1984

腾讯 · 高级产品经理 (已认证)

腾讯研发管理部产品经理
推荐

数据万象持久化在JavaScript SDK中的问题?

可以的,有Domain参数。请参考:https://github.com/tencentyun/cos-js-sdk-v5/blob/master/csp/csp.html#L56

所属标签

扫码关注云+社区

领取腾讯云代金券