像这个删除的问题,我想定义一个存储库(接口和具体类),Collection
它List
使用流生成一个。流应过滤掉一些元素,例如按姓氏选择人物对象,或按物种选择动物对象。所有这些应该使用泛型是类型安全的。
我收到一个错误: Collection cannot be resolved to a type
也许有人在乎提供一个小例子。
发布于 2019-06-06 11:04:51
是的,你肯定能产生List
如ArrayList
在具体的类,而返回的更普遍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'}]
https://stackoverflow.com/questions/-100006938
复制相似问题