[CQ Engine] Ich möchte Sammlungen wie Stream oder .Net LINQ auch in Java 7 verarbeiten.

Hintergrund

Deshalb habe ich nach Java7 gesucht, das intelligente Erfassungsvorgänge wie Stream und LinQ ausführen kann. (Wenn Sie einen anderen Weg kennen, um das Umdrehen der for-Anweisung zu vermeiden, lassen Sie es mich bitte wissen.)

Über die CQ Engine

Awesome Java: Großartige Java Framework Library-Software Es wurde im obigen Artikel vorgestellt.

CQEngine Offizielles Repository Github: CQengin

License Die Lizenz von "CQ Engine" lautet "Apache License 2.0".

So schreiben Sie eine Erfassungsoperation in CQEngine

Verwendung der Abfrage

// 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));


Verwenden von CQN-Dialekten

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\")"
								+ " )");

SQL-Dialekte verwenden

// 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());
}

Überprüfung

Maven ~~ Die aktuellste Version ist enthalten ~~ Fügen Sie "2.12.4" ein, das mit Java 7 verwendet werden kann.

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

In den Versionshinweisen scheint Java 7 und niedriger von Ver3 ausgeschlossen zu sein. CQEngine Release Notes

Daten zum Vergleich vorbereiten

Modell für die Sammlung vorbereiten

Ich habe ein Auto gemacht. * @Data wird beschrieben, weil Lombok verwendet wird.

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

Vergleich

Java für Anweisung

// 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])
}

Verwenden Sie CQN (CQ Engine Native)

Da es als Ersatz für Stream verwendet werden soll, überprüfen wir es mit der Richtlinie, POJO kein Attribut hinzuzufügen. Versuchen Sie, die CQN-Notation ohne Attribut zu verwenden. Generate attributes from private class fields Es scheint schwierig zu sein, das private Feld von POJO abzurufen, daher habe ich die Einstellung so festgelegt, dass in createAttributes getter verwendet wird.

// 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() );
//(Kürzung)
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])
}

Java 8 Stream

// 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() );
//(Kürzung)
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());
}

Verwendung von CQ Engine mit Java 7 oder niedriger

Da Java7 für CQEngine Ver3 und höher nicht unterstützt wird, tritt der folgende Fehler auf.

 Unsupported major.minor version 52.0

Fazit

Verwenden Sie Stream einfacher mit Java7-

Lightweight-Stream-API-Ich möchte die Stream-API mit Java 6 und 7 verwenden Dies scheint eine Bibliothek zu sein, die wie Stream verwendet werden kann Bei der Migration auf Java8 wird diese Bibliothek vor der Migration verwendet, und der Code nach der Migration lautet Java8 Stream. Ich dachte, ich müsste vorsichtig sein, um nicht in eine chaotische Situation zu geraten Dieses Mal habe ich mich entschlossen zu untersuchen, ob CQ Engine die Standardbibliothek für Java 8 und höher überschreiten kann. Daher möchte ich in Zukunft die Leistung von CQ Engine bei der Verarbeitung großer Datenmengen bewerten.

Verwendung mit einer großen Datenmenge

(Ich werde in einem anderen Artikel schreiben) Es ist schwierig, die Daten vorzubereiten. Suchen Sie daher nach einer API, die viele Daten abrufen kann. Kann von Einzelpersonen verwendet werden! Empfohlene API-Liste

Recommended Posts

[CQ Engine] Ich möchte Sammlungen wie Stream oder .Net LINQ auch in Java 7 verarbeiten.
Ich möchte so etwas wie "cls" in Java machen
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben (PowerMockito Edition)
(Beschränkt auf Java 7 oder höher) Ich möchte, dass Sie Objekte in Objects.equals vergleichen
Ich möchte eine E-Mail in Java senden.
rsync4j - Ich möchte rsync in Java berühren.
Ich möchte irgendwann sogar in Kotlin sein
Sogar in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben (Javassist zweite Abkochung)
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 (Black Magic) ausgeben.
Ich möchte ES2015 auch in Java verwenden! → (´ ・ ω ・ `)
So behandeln Sie Ausnahmen mit Java 8 Stream oder Optional kühl
Ich möchte eine Parkettdatei auch in Ruby erstellen
Ich möchte die if-else-Anweisung für bedingte Verzweigungen in Java vereinfachen
[Java] Ich möchte überprüfen, ob die Elemente in der Liste null oder leer sind. [Collection Utils]
[Java] Ich möchte mit dem Schlüssel im Objekt eindeutig arbeiten
Ich möchte die IP-Adresse erhalten, wenn ich mit Java eine Verbindung zu Wi-Fi herstelle
Ich möchte für jedes Array mit Lambda-Ausdruck in Java
[Java Spring MVC] Ich möchte DI in meiner eigenen Klasse verwenden
Ich möchte Java-Updates insgesamt stoppen
Ich möchte @Autowired in Servlet verwenden
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben (graue Magie, die weniger schwarze Magie ist)
Auch wenn ich den Inhalt eines Datenobjekts in Java in JSON konvertieren möchte, gibt es einen Zirkelverweis ...
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben (Royal Road Edition, die weder Magie noch irgendetwas ist)
R von Java ausführen Ich möchte rJava ausführen
Ich möchte Java8 für jeden mit Index verwenden
Ich möchte APP_HOME an Logback in Gradle übergeben
Ich wollte (a == 1 && a == 2 && a == 3) in Java wahr machen
Ich habe versucht, neunundneunzig in Java auszugeben
Ich möchte schnell von Java nach SQLite schreiben
Ich habe versucht, Alexa-Fähigkeiten mit Java zu erstellen
Ich möchte den Wert in Ruby erhalten
[Android Studio] Ich möchte Einschränkungen für die in EditText [Java] registrierten Werte festlegen.
Ich möchte ein Objekt im CSV-Format mit mehrzeiligem Header und Filter in Java zurückgeben
# 1_JAVA Ich möchte die Indexnummer durch Angabe eines Zeichens in der Zeichenfolge erhalten