[Moteur CQ] Je souhaite gérer des collections comme Stream ou .Net LINQ même dans Java 7.

Contexte

J'ai donc recherché Java7 capable d'effectuer des opérations de collecte intelligentes telles que Stream et LinQ. (Si vous connaissez un autre moyen d'éviter de tourner la déclaration for, veuillez me le faire savoir)

À propos de CQ Engine

Awesome Java: Great Java Framework Library Software Il a été introduit dans l'article ci-dessus.

CQEngine Dépôt officiel Github: CQengin

License La licence de "CQ Engine" est "Apache License 2.0".

Comment écrire une opération de collecte dans CQEngine

Utilisation de la requête

// already defined Attribute in Car Class
// search brand-new AAACar
uery<Car> query1 =	and(
						endsWith(Car.NAME, "AAACar"),
						equal(Car.DISCREPRION, "brandNew")
					);
ResultSet<car> resultSet = cars.retrieve(query1));


Utilisation des dialectes CQN

import static com.googlecode.cqengine.codegen.AttributeBytecodeGenerator.*;

// generate Attribute
CQNParser<Car> parser = CQNParser.forPojoWithAttributes(Car.class, createAttributes(Car.class));
// search brand-new AAACar
ResultSet<Car> results = parser.retrieve(cars,
								"and("
									+ "equal(\"name\",\"AAACar\"),"
									+ "equal(\"discription\", \"brandNew\")"
								+ " )");

Utilisation des dialectes SQL

// generate Attribute
SQLParser<Car> parser = SQLParser.forPojoWithAttributes(Car.class, createAttributes(Car.class));

// search brand-new AAACar
ResultSet<Car> results = parser.retrieve(cars,
								"SELECT * FROM cars " +
								"WHERE (" +
									" name = 'AAACar' " +
									" AND discription = 'brandNew')"
								);

for (Car car : results ) {
	System.out.println(car.toString());
}

Vérification

Maven ~~ La dernière version pour le moment est incluse ~~ Insérez "2.12.4" qui peut être utilisé avec Java 7.

<dependency>
  <groupId>com.googlecode.cqengine</groupId>
  <artifactId>cqengine</artifactId>
  <version>2.12.4</version>
</dependency>

En regardant les notes de publication, il semble que Java 7 et les versions antérieures soient exclus de la Ver3. CQEngine Release Notes

Préparation des données pour la comparaison

Préparer un modèle pour la collection

J'ai fait une voiture. * @Data est décrit car lombok est utilisé.

@Data
public class Car {
	private int carId;
	private String name;
	private String discription;
	private List<String> features;
}

Comparaison

Java pour instruction

// create car collection
Set<Car> cars = new HashSet<>();
cars.add( Car.builder().carId(0).name("AAACar").discription("brandNew").features( Arrays.asList("spare tyre", "sunroof")).build() );
cars.add( Car.builder().carId(1).name("BBBCar").discription("used").features( Arrays.asList("spare tyre", "radio")).build() );
cars.add( Car.builder().carId(2).name("CCCCar").discription("used").features( Arrays.asList("radio", "sunroof")).build() );
cars.add( Car.builder().carId(3).name("DDDCar").discription("brandNew").features( Arrays.asList("spare tyre", "sunroof")).build() );
cars.add( Car.builder().carId(4).name("AAACar").discription("used").features( Arrays.asList("radio", "sunroof")).build() );
cars.add( Car.builder().carId(5).name("BBBCar").discription("brandNew").features( Arrays.asList("spare tyre", "radio")).build() );
cars.add( Car.builder().carId(6).name("CCCCar").discription("brandNew").features( Arrays.asList("spare tyre", "sunroof")).build() );
cars.add( Car.builder().carId(7).name("DDDCar").discription("used").features( Arrays.asList("radio", "sunroof")).build() );
cars.add( Car.builder().carId(8).name("AAACar").discription("used").features( Arrays.asList("spare tyre", "sunroof")).build() );
cars.add( Car.builder().carId(9).name("BBBCar").discription("used").features( Arrays.asList("spare tyre", "radio")).build() );
cars.add( Car.builder().carId(10).name("CCCCar").discription("brandNew").features( Arrays.asList("spare tyre", "sunroof")).build() );

// search brand-new AAACar
Set<Car> results = new HashSet<>();
for (Car car : cars) {
	if ( Objects.equals(car.getName(), "AAACar")
			&& Objects.equals(car.getDiscription(), "brandNew") ) {
		results.add(car);
	}
}

for (Car car : results ) {
	System.out.println(car.toString()); // => Car(carId=0, name=AAACar, discription=brandNew, features=[spare tyre, sunroof])
}

Utiliser CQN (CQ Engine Native)

Puisqu'il est destiné à être utilisé comme un substitut à Stream, nous le vérifierons avec une politique de ne pas ajouter d'attribut à POJO. Essayez d'utiliser la notation CQN sans attribut. Generate attributes from private class fields Il semble difficile d'obtenir le champ privé de POJO, j'ai donc défini le paramètre pour utiliser getter dans createAttributes.

// generate Attribute
CQNParser<Car> parser = CQNParser.forPojoWithAttributes(Car.class, createAttributes(Car.class, MemberFilters.GETTER_METHODS_ONLY));

// create car collection
IndexedCollection<Car> cars = new ConcurrentIndexedCollection<>();
cars.add( Car.builder().carId(0).name("AAACar").discription("brandNew").features( Arrays.asList("spare tyre", "sunroof")).build() );
//(réduction)
cars.add( Car.builder().carId(10).name("CCCCar").discription("brandNew").features( Arrays.asList("spare tyre", "sunroof")).build() );

// search brand-new AAACar
ResultSet<Car> results = parser.retrieve(cars,
								"and("
									+ "equal(\"getName\",\"AAACar\"),"
									+ "equal(\"getDiscription\", \"brandNew\")"
								+ " )");

for (Car car : results ) {
	System.out.println(car.toString());   // => Car(carId=0, name=AAACar, discription=brandNew, features=[spare tyre, sunroof])
}

Flux Java 8

// create car collection
Set<Car> cars = new HashSet<>();
cars.add( Car.builder().carId(0).name("AAACar").discription("brandNew").features( Arrays.asList("spare tyre", "sunroof")).build() );
//(réduction)
cars.add( Car.builder().carId(10).name("CCCCar").discription("brandNew").features( Arrays.asList("spare tyre", "sunroof")).build() );

// search brand-new AAACar
Set<Car> results =  cars.stream()
						.filter(car -> Objects.equals(car.getName(), "AAACar")
								&& Objects.equals(car.getDiscription(), "brandNew") )
						.collect(Collectors.toSet());

for (Car car : results ) {
	System.out.println(car.toString());
}

Comment utiliser CQ Engine avec Java 7 ou une version antérieure

Étant donné que Java7 n'est pas pris en charge pour CQEngine Ver3 et supérieur, l'erreur suivante se produit.

 Unsupported major.minor version 52.0

Conclusion

Utilisez Stream plus simplement avec Java7-

Lightweight-Stream-API-I want to use Stream API with Java 6 and 7 Cela semble être une bibliothèque qui peut être utilisée comme Stream tel quel Lors de la migration vers Java8, cette bibliothèque est utilisée avant la migration et le code après la migration est Java8 Stream. Je pensais que je devais faire attention à ne pas entrer dans une situation chaotique Cette fois, j'ai décidé d'étudier du point de vue de savoir si CQ Engine peut dépasser la bibliothèque standard pour Java 8 et versions ultérieures. Donc, à l'avenir, j'aimerais évaluer les performances de CQ Engine dans le traitement de grandes quantités de données.

Utiliser avec une grande quantité de données

(J'écrirai dans un autre article) Il est difficile de préparer les données, alors recherchez une API qui peut obtenir beaucoup de données. Peut être utilisé par des particuliers! Liste des API recommandées

Recommended Posts

[Moteur CQ] Je souhaite gérer des collections comme Stream ou .Net LINQ même dans Java 7.
Je veux faire quelque chose comme "cls" en Java
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3 (édition PowerMockito)
(Limité à Java 7 ou version ultérieure) Je souhaite que vous compariez des objets dans Objects.equals
Je souhaite envoyer un e-mail en Java.
rsync4j --Je veux toucher rsync en Java.
Je veux être finalement même à kotlin
Même en Java, je veux sortir true avec un == 1 && a == 2 && a == 3 (deuxième décoction Javassist)
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3 (Black Magic)
Je veux aussi utiliser ES2015 avec Java! → (´ ・ ω ・ `)
Comment gérer les exceptions froidement avec Java 8 Stream ou en option
Je veux créer un fichier Parquet même en Ruby
Je souhaite simplifier l'instruction if-else de la branche conditionnelle en Java
[Java] Je veux vérifier que les éléments de la liste sont nuls ou vides [Collection Utils]
[Java] Je veux effectuer distinctement avec la clé dans l'objet
Je souhaite obtenir l'adresse IP lors de la connexion au Wi-Fi avec Java
Je veux ForEach un tableau avec une expression Lambda en Java
[Java Spring MVC] Je souhaite utiliser DI dans ma propre classe
Je veux arrêter complètement les mises à jour Java
Je veux utiliser @Autowired dans Servlet
Même en Java, je veux sortir vrai avec un == 1 && a == 2 && a == 3 (magie grise qui n'est pas tant que magie noire)
Même si je souhaite convertir le contenu d'un objet de données en JSON en Java, il existe une référence circulaire ...
Même en Java, je veux sortir true avec un == 1 && a == 2 && a == 3 (Royal road edition qui n'est ni magique ni rien)
Exécuter R à partir de Java Je veux exécuter rJava
Je veux utiliser java8 forEach avec index
Je souhaite transmettre APP_HOME pour me connecter à Gradle
Je voulais que (a == 1 && a == 2 && a == 3) vrai en Java
J'ai essayé de sortir quatre-vingt-dix-neuf en Java
Je veux écrire rapidement de java vers sqlite
J'ai essayé de créer une compétence Alexa avec Java
Je veux obtenir la valeur en Ruby
[Android Studio] Je souhaite définir des restrictions sur les valeurs enregistrées dans EditText [Java]
Je souhaite renvoyer un objet au format CSV avec en-tête et filtre multilignes en Java
# 1_JAVA Je veux obtenir le numéro d'index en spécifiant un caractère dans la chaîne de caractères