<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Программирование на Java, Android, Delphi</title>
		<link>http://icoder.ucoz.ru/</link>
		<description>Блог</description>
		<lastBuildDate>Wed, 15 Jun 2016 08:11:31 GMT</lastBuildDate>
		<generator>uCoz Web-Service</generator>
		<atom:link href="https://icoder.ucoz.ru/blog/rss" rel="self" type="application/rss+xml" />
		
		<item>
			<title>npm выдает ошибку сертификата UNABLE_TO_GET_ISSUER_CERT_LOCALLY</title>
			<description>&lt;p&gt;Для решения проблемы выполнить команду &lt;strong&gt;npm config set strict-ssl false&lt;/strong&gt;&lt;/p&gt;</description>
			<content:encoded>&lt;p&gt;Для решения проблемы выполнить команду &lt;strong&gt;npm config set strict-ssl false&lt;/strong&gt;&lt;/p&gt;</content:encoded>
			<link>https://icoder.ucoz.ru/blog/npm_vydaet_oshibku_sertifikata_unable_to_get_issuer_cert_locally/2016-06-15-82</link>
			<category>Java (Общие вопросы)</category>
			<dc:creator>alex</dc:creator>
			<guid>https://icoder.ucoz.ru/blog/npm_vydaet_oshibku_sertifikata_unable_to_get_issuer_cert_locally/2016-06-15-82</guid>
			<pubDate>Wed, 15 Jun 2016 08:11:31 GMT</pubDate>
		</item>
		<item>
			<title>Альтернативы</title>
			<description>&lt;p&gt;Альтернативы помогают изменять точку инжекции простым настраиванием beans.xml. Для этого достаточно описать альтернативную точку инжекции и пометить ее квалификатором (или оставить без квалификатора для @Default) ...</description>
			<content:encoded>&lt;p&gt;Альтернативы помогают изменять точку инжекции простым настраиванием beans.xml. Для этого достаточно описать альтернативную точку инжекции и пометить ее квалификатором (или оставить без квалификатора для @Default) $CUT$&lt;/p&gt;

&lt;pre class=&quot;brush: xml&quot;&gt;
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://xmlns.jcp.org/xml/ns/javaee&quot;
 xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
 xsi:schemaLocation=&quot;http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd&quot;
 bean-discovery-mode=&quot;annotated&quot;&gt;
 
 &lt;alternatives&gt;
 &lt;class&gt;CDI.AlternativeGenerator&lt;/class&gt;
 &lt;class&gt;CDI.AlternativeGenerator2&lt;/class&gt;
 &lt;/alternatives&gt;
&lt;/beans&gt;
&lt;/pre&gt;

&lt;pre class=&quot;brush: java&quot;&gt;
package CDI;

import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Alternative;

@RequestScoped
@Alternative @QFirstGen
public class AlternativeGenerator implements NumberGenerator {

 
 @Override
 public String generateNumber() {
 return &quot;Отработал альтернативный генератор 111-222-333&quot;;
 }
 
}
&lt;/pre&gt;</content:encoded>
			<link>https://icoder.ucoz.ru/blog/alternativy/2016-02-09-79</link>
			<category>Java EE</category>
			<dc:creator>alex</dc:creator>
			<guid>https://icoder.ucoz.ru/blog/alternativy/2016-02-09-79</guid>
			<pubDate>Tue, 09 Feb 2016 07:47:25 GMT</pubDate>
		</item>
		<item>
			<title>Инжекция зависимости через поле, конструктор и сеттер</title>
			<description>&lt;p&gt;Примеры инжекций различными способами...</description>
			<content:encoded>&lt;p&gt;Примеры инжекций различными способами$CUT$&lt;/p&gt;

&lt;pre class=&quot;brush: java&quot;&gt;
import CDI.Digits;
import CDI.NumberGenerator;
import CDI.QFirstGen;
import CDI.QGenWithMember;
import CDI.QSecondGen;
import java.util.logging.Logger;
import javax.inject.Named;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Default;
import javax.inject.Inject;

@Named(value = &quot;person&quot;)
@RequestScoped
public class Person {
 
 //инжекция через конструктор с использованием квалификаторов - инжекцием помечается конструктор, а квалификаторами - параметры если нужно квалифицировать точку инжекции
 @Inject
 public Person(@QSecondGen NumberGenerator generator2, @QGenWithMember(digits = Digits.TEN, odd = true) NumberGenerator generator3) {
 this.generator2 = generator2;
 this.generator3 = generator3;
 }
 
 //инжекция через поле
 @Inject @QFirstGen
 NumberGenerator generator1;
 //инжекция будет через конструктор
 NumberGenerator generator2;
 NumberGenerator generator3;
 //инжекция будет через сеттеры
 NumberGenerator generator4;
 NumberGenerator generator5;
 
 private String firstName;
 private String secondName;
 private String thirdName;
 private Integer age;

 //инжекция через сеттер - тут можно прямо с квалификатором
 @Inject @QSecondGen
 public void setGenerator4(NumberGenerator generator4) {
 this.generator4 = generator4;
 }

 //или квалификатор поместить в параметры сеттера
 @Inject
 public void setGenerator5(@QGenWithMember(digits = Digits.TEN, odd = true) NumberGenerator generator5) {
 this.generator5 = generator5;
 }

 public String getFirstName() {
 return firstName;
 }

 public void setFirstName(String firstName) {
 this.firstName = firstName;
 }

 public String getSecondName() {
 return secondName;
 }

 public void setSecondName(String secondName) {
 this.secondName = secondName;
 }

 public String getThirdName() {
 return thirdName;
 }

 public void setThirdName(String thirdName) {
 this.thirdName = thirdName;
 }

 public Integer getAge() {
 return age;
 }

 public void setAge(Integer age) {
 this.age = age;
 }
 
 public String execConfirm(){
 System.out.println(&quot;Инжектим в поле&quot;);
 System.out.println(generator1.generateNumber());
 System.out.println(&quot;Инжектим через конструктор&quot;);
 System.out.println(generator2.generateNumber());
 System.out.println(generator3.generateNumber());
 System.out.println(&quot;Инжектим через сеттер&quot;);
 System.out.println(generator4.generateNumber());
 System.out.println(generator5.generateNumber());
 return &quot;showinfo&quot;;
 }
}

&lt;/pre&gt;</content:encoded>
			<link>https://icoder.ucoz.ru/blog/inzhekcija_zavisimosti_cherez_pole_konstruktor_i_setter/2016-02-09-78</link>
			<category>Java EE</category>
			<dc:creator>alex</dc:creator>
			<guid>https://icoder.ucoz.ru/blog/inzhekcija_zavisimosti_cherez_pole_konstruktor_i_setter/2016-02-09-78</guid>
			<pubDate>Tue, 09 Feb 2016 06:51:46 GMT</pubDate>
		</item>
		<item>
			<title>Stream API и Lambda в Java 8</title>
			<description>&lt;p&gt;Несколько примеров использования потокового API и лямбд в Java (работают начиная с 8 версии)&lt;/p&gt;

&lt;p&gt;...</description>
			<content:encoded>&lt;p&gt;Несколько примеров использования потокового API и лямбд в Java (работают начиная с 8 версии)&lt;/p&gt;

&lt;p&gt;$CUT$&lt;/p&gt;

&lt;pre class=&quot;brush: java&quot;&gt;
import java.io.File;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.Random;
import java.util.Spliterator;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;


public class MainClass {
 
 private static void ln(){
 System.out.println(&quot;-------------------------------------------&quot;);
 }
 
 private static void disp(Object val){
 System.out.println(val.toString());
 }

 public static void main(String[] args) {
 
 ln();
 disp(&quot;вывод списка через лямбду&quot;);
 List&lt;string&gt; strList = Arrays.asList(&quot;aaa&quot;, &quot;fff&quot;, &quot;cccc&quot;, &quot;vvv&quot;, &quot;bbb&quot;);
 strList.forEach(action -&amp;gt; System.out.println(action));
 
 ln();
 disp(&quot;вызов операций реализованные лямбдой&quot;);
 Tester tester = new Tester();
 MyAction action1 = tester.getAction();
 action1.doAction();
 
 MyCalculate calc1 = tester.getSummaOperation();
 System.out.println(calc1.operation(100, 200));
 
 calc1 = tester.getDiffOperation();
 System.out.println(calc1.operation(100, 200));
 
 calc1 = tester.getBiggest();
 System.out.println(calc1.operation(120, 150));
 
 calc1 = tester.getLowest();
 System.out.println(calc1.operation(99, 98));
 
 
 ln();
 disp(&quot;сортировка списка - компаратор через анонимный класс&quot;);
 List&lt;integer&gt; int_array = Arrays.asList(22, 56, 34, 5665, 34, 5757, 32);
 //Arrays.sort(int_array, (a, b) -&amp;gt; a &amp;gt; b);
 int_array.sort(new Comparator&lt;integer&gt;(){

 @Override
 public int compare(Integer o1, Integer o2) {
 return o2 - o1;
 }
 
 });
 int_array.forEach(value -&amp;gt; disp(value));
 
 ln();
 disp(&quot;сортировка списка через лямбду&quot;);
 int_array.sort((a, b) -&amp;gt; a - b);
 int_array.forEach(value -&amp;gt; disp(value));
 
 ln();
 disp(&quot;Файлы в директории&quot;);
 File file = new File(&quot;D:&amp;#92;&amp;#92;distrib&quot;);
 List&lt;file&gt; fileList = Arrays.asList(file.listFiles());
 fileList.forEach(item -&amp;gt; disp(item.getAbsolutePath()));
 
 ln();
 disp(&quot;Только папки в директории&quot;);
 fileList.stream().filter(item -&amp;gt; item.isDirectory()).forEach(item -&amp;gt; disp(item.getAbsolutePath()));
 
 ln();
 disp(&quot;Только файлы в директории&quot;);
 fileList.stream().filter(Tester::isFolder).forEach(item -&amp;gt; disp(item.getAbsolutePath()));
 
 ln();
 disp(&quot;Только файлы zip и jar&quot;);
 Predicate&lt;file&gt; isZipPredicate = Tester::isZipFile;
 Predicate&lt;file&gt; isExePredicate = Tester::isExeFile;
 fileList.stream().filter(isZipPredicate.or(isExePredicate)).forEach(item -&amp;gt; disp(item.getName())); 
 
 ln();
 disp(&quot;Потестим потоковый API&quot;);
 List&lt;string&gt; strings = Arrays.asList(&quot;begin&quot;, &quot;&quot;, &quot;sdfsf&quot;, &quot;efwerwg&quot;, &quot;abffsfsfsfcd&quot;,&quot;&quot;, &quot;ajkl&quot;, &quot;sdfsffsfsfsf&quot;, &quot;&quot;, &quot;the end&quot;, &quot;ahsdjsd&quot;);
 strings.stream().filter(string -&amp;gt; !string.isEmpty()).map(item -&amp;gt; item.toUpperCase()).collect(Collectors.toList()).forEach(System.out::println);
 
 ln();
 disp(&quot;Фильтрация - выведем элементы списка начинающиеся на &amp;#92;&quot;a&amp;#92;&quot;&quot;);
 strings.stream().filter(predicate -&amp;gt; predicate.startsWith(&quot;a&quot;)).forEach(System.out::println);
 
 ln();
 disp(&quot;Заменим все пустые элементы на константы&quot;);
 strings.stream().map(item -&amp;gt; {if(item.isEmpty()) return &quot;CONST&quot;; return item;}).forEach(System.out::println);
 
 
 ln();
 disp(&quot;Заменим все пустые элементы на константы и ограничим 5 элементами&quot;);
 Consumer&lt;string&gt; print = System.out::println;
 strings.stream().map(item -&amp;gt; {if(item.isEmpty()) return &quot;CONST&quot;; return item;}).limit(5).forEach(print);
 
 ln();
 disp(&quot;Отсортируем случайные числа&quot;);
 Random random = new Random();
 random.ints().limit(10).sorted().forEach(System.out::println);
 
 ln();
 disp(&quot;Заменим все пустые элементы на константы и отсортируем без учета регистра&quot;);
 strings.stream().map(item -&amp;gt; {if(item.isEmpty()) return &quot;CONST&quot;; return item;}).sorted((a, b) -&amp;gt; a.compareToIgnoreCase(b)).forEach(print);
 
 ln();
 disp(&quot;Выведем количество пустых элементов&quot;);
 disp(strings.parallelStream().filter(string -&amp;gt; string.isEmpty()).count());
 
 
 ln();
 disp(&quot;Используем peek&quot;);
 Stream.of(&quot;one&quot;, &quot;two&quot;, &quot;three&quot;, &quot;sdfsdf&quot;,&quot;osdfsdfne&quot;, &quot;sdfhrfyry&quot;, &quot;three&quot;, &quot;rtyrtyrty&quot;,&quot;oyuyuyune&quot;, &quot;twyuyuyo&quot;, &quot;thryuee&quot;, &quot;fouyututr&quot;,&quot;onyuyuye&quot;, &quot;tyutyuttyutyuwo&quot;, &quot;thtyutyutree&quot;, &quot;fouryuyuyu&quot;)
 .filter(e -&amp;gt; e.length() &amp;gt; 3)
 .peek(e -&amp;gt; System.out.println(&quot;Filtered value: &quot; + e))
 .map(String::toUpperCase)
 .peek(e -&amp;gt; System.out.println(&quot;Mapped value: &quot; + e))
 .collect(Collectors.toList());
 
 ln();
 disp(&quot;Используем reduce для умножения нечетных элементов списка&quot;);
 List&lt;integer&gt; int_arr = Arrays.asList(1, 2, 3, 4, 5);
 Optional&lt;integer&gt; res = int_arr.stream().filter(n -&amp;gt; n % 2 == 1).reduce((a, b) -&amp;gt; a*b);
 if(res.isPresent()) disp(res.get());
 
 ln();
 disp(&quot;Используем reduce для умножения нечетных элементов списка&quot;);
 res = int_arr.stream().reduce((a, b) -&amp;gt; {if(b % 2 == 1) return a * b; return a;});
 if(res.isPresent()) disp(res.get());
 
 ln();
 disp(&quot;Используем Сплитератор&quot;);
 Spliterator&lt;string&gt; spl = Stream.of(&quot;one&quot;, &quot;two&quot;, &quot;three&quot;, &quot;for&quot;, &quot;fiveee&quot;).spliterator();
 spl.forEachRemaining(item -&amp;gt; disp(item));
 
 disp(&quot;еще раз Сплитератор&quot;);
 spl = Stream.of(&quot;one&quot;, &quot;two&quot;, &quot;three&quot;, &quot;for&quot;, &quot;fiveee&quot;).spliterator();
 while(spl.tryAdvance(item -&amp;gt; disp(item)));
 
 ln();
 disp(&quot;Используем map для преобразования потока строк в поток целых чисел, содержащих их длину&quot;);
 Stream&lt;string&gt; strStream = Stream.of(&quot;one&quot;, &quot;two&quot;, &quot;three&quot;, &quot;for&quot;, &quot;fiveee&quot;);
 strStream.map(item -&amp;gt; new Integer(item.length())).forEach(item -&amp;gt; disp(item.toString()));
 
 ln();
 disp(&quot;Определяем вхождение элемента в потоке по критерию&quot;);
 List&lt;string&gt; listValues = Arrays.asList(&quot;alex&quot;, &quot;andrey&quot;, &quot;aleksey&quot;, &quot;adam&quot;, &quot;angella&quot;, &quot;alena&quot;, &quot;arkadiiy&quot;);
 
 disp(&quot;любое вхождение&quot;);
 disp(listValues.stream().anyMatch(val -&amp;gt; val.startsWith(&quot;ang&quot;)));
 disp(&quot;все вхождения&quot;);
 disp(listValues.stream().allMatch(val -&amp;gt; val.startsWith(&quot;a&quot;)));
 disp(&quot;количество элементов в потоке&quot;);
 disp(listValues.stream().count());
 
 ln();
 disp(&quot;Попробуем ссылку на метод&quot;);
 listValues.stream().forEach(System.out::println);
 
 ln();
 disp(&quot;Попробуем параллельный поток на метод&quot;);
 listValues.parallelStream()
 .filter(e -&amp;gt; e.length() &amp;gt; 3)
 .peek(e -&amp;gt; System.out.println(&quot;Filtered value: &quot; + e))
 .map(String::toUpperCase)
 .peek(e -&amp;gt; System.out.println(&quot;Mapped value: &quot; + e))
 .collect(Collectors.toList());
 
 ln();
 disp(&quot;Конкатенация сведением&quot;);
 
 disp(listValues.stream().reduce((a, b) -&amp;gt; a + &quot;_&quot; + b).get());
 
 ln();
 disp(listValues.stream().reduce((a, b) -&amp;gt; a + &quot;_&quot; + b).orElse(&quot;Пустая строка&quot;));
 ln();
 disp(&quot;сумма длинн слов в коллекции&quot;);
 disp(listValues.stream().map(str -&amp;gt; str.length()).reduce((a, b) -&amp;gt; a + b).orElse(0));
 
 disp(&quot;сумма длинн слов в коллекции с использовванием reduce (версия со значением идентичности) его можно расматривать как начальное значение&quot;);
 disp(listValues.stream().map(str -&amp;gt; str.length()).reduce(5, (a, b) -&amp;gt; a + b));
 
 disp(listValues.stream().map(str -&amp;gt; str.length()).reduce(5, (a, b) -&amp;gt; a + b));
 
 ln();
 disp(&quot;reduce с накоплением и объединением&quot;);
 List&lt;double&gt; int_list = Arrays.asList(1.0, 4.0, 9.0, 1.0, 9.0, 1.0);
 disp(int_list.stream().peek(el -&amp;gt; System.out.println(&quot;el: &quot; + el)).reduce(1.0 , (x, y) -&amp;gt; {disp(&quot;x = &quot; + x); disp(&quot;y = &quot; + y); return x * Math.sqrt(y);}, (a, b) -&amp;gt; {disp(&quot;a = &quot; + a); disp(&quot;b = &quot; + b); return a * b;}));
 ln();
 disp(&quot;reduce с накоплением и объединением&quot;);
 disp(int_list.stream().peek(el -&amp;gt; System.out.println(&quot;el: &quot; + el)).reduce((x, y) -&amp;gt; x * Math.sqrt(y)).get());
 
 ln();
 final List&lt;bigdecimal&gt; prices = Arrays.asList(
 new BigDecimal(&quot;10&quot;), new BigDecimal(&quot;30&quot;), new BigDecimal(&quot;17&quot;),
 new BigDecimal(&quot;20&quot;), new BigDecimal(&quot;15&quot;), new BigDecimal(&quot;18&quot;),
 new BigDecimal(&quot;45&quot;), new BigDecimal(&quot;12&quot;));
 
 BigDecimal totalOfDiscountedPrices = BigDecimal.ZERO;
 for(BigDecimal price : prices) {
 if(price.compareTo(BigDecimal.valueOf(20)) &amp;gt; 0)
 totalOfDiscountedPrices =
 totalOfDiscountedPrices.add(price.multiply(BigDecimal.valueOf(0.9)));
 }
 System.out.println(&quot;Total of discounted prices: &quot; + totalOfDiscountedPrices);
 
 totalOfDiscountedPrices =
 prices.stream()
 .filter(price -&amp;gt; price.compareTo(BigDecimal.valueOf(20)) &amp;gt; 0)
 .map(price -&amp;gt; price.multiply(BigDecimal.valueOf(0.9)))
 .reduce(BigDecimal.ZERO, BigDecimal::add);
 System.out.println(&quot;Total of discounted prices: &quot; + totalOfDiscountedPrices);
 

 }

}

&lt;/bigdecimal&gt;&lt;/double&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;&lt;/integer&gt;&lt;/integer&gt;&lt;/string&gt;&lt;/string&gt;&lt;/file&gt;&lt;/file&gt;&lt;/file&gt;&lt;/integer&gt;&lt;/integer&gt;&lt;/string&gt;&lt;/pre&gt;</content:encoded>
			<link>https://icoder.ucoz.ru/blog/stream_api_i_lambda_v_java_8/2015-11-19-77</link>
			<category>Java (Общие вопросы)</category>
			<dc:creator>alex</dc:creator>
			<guid>https://icoder.ucoz.ru/blog/stream_api_i_lambda_v_java_8/2015-11-19-77</guid>
			<pubDate>Thu, 19 Nov 2015 13:55:37 GMT</pubDate>
		</item>
		<item>
			<title>Сортировка коллекции различными способами</title>
			<description>Небольшие куски кода по сортировке ...</description>
			<content:encoded>Небольшие куски кода по сортировке $CUT$
&lt;pre class=&quot;brush: java&quot;&gt;
package main;

import java.util.Iterator;

public class Point implements Comparable&lt;Point&gt;{
 private int X;
 private int Y;
 private int Z;
 
 public Point(int x, int y, int z) {
 super();
 X = x;
 Y = y;
 Z = z;
 }
 public int getX() {
 return X;
 }
 public void setX(int x) {
 X = x;
 }
 public int getY() {
 return Y;
 }
 public void setY(int y) {
 Y = y;
 }
 public int getZ() {
 return Z;
 }
 public void setZ(int z) {
 Z = z;
 }
 @Override
 public String toString() {
 StringBuilder builder = new StringBuilder();
 builder.append(&quot;Point [X=&quot;);
 builder.append(X);
 builder.append(&quot;, Y=&quot;);
 builder.append(Y);
 builder.append(&quot;, Z=&quot;);
 builder.append(Z);
 builder.append(&quot;]&quot;);
 return builder.toString();
 }
 //@Override
 public int compareTo(Point o) {
 return this.X - o.X;
 }
 
}

&lt;/pre&gt;

&lt;pre class=&quot;brush: java&quot;&gt;
package main;

import java.util.function.Consumer;

public class PointConsumer implements Consumer&lt;Point&gt; {

 @Override
 public void accept(Point t) {
 if (t.getX() &gt; 100 || t.getY() &gt; 100 || t.getZ() &gt; 100){
 System.out.println(&quot;Неправильно задана координата: &quot; + t.toString());
 }
 else{
 System.out.println(&quot;ПРАВИЛЬНАЯ КООРДИНАТА: &quot; + t.toString());
 }
 
 }

}

&lt;/pre&gt;

&lt;pre class=&quot;brush: java&quot;&gt;
package main;

import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Random;

public class MainProjectClass {
 
 private static final String Separatishe = &quot;Это сепаратор!!!!!&quot;;

 public static void main(String[] args) {
 
 List&lt;Point&gt; points = new ArrayList&lt;&gt;();
 Random rnd = new Random();
 
 for(int i = 0; i &lt; 1000; i ++){
 points.add(new Point(rnd.nextInt(300), rnd.nextInt(300), rnd.nextInt(300)));
 }
 
 Iterator&lt;Point&gt; iter = points.iterator();
 while (iter.hasNext()){
 System.out.println(iter.next());
 }
 
 System.out.println(&quot;Выведем неправильные координаты:&quot;);
 iter = points.iterator();
 iter.forEachRemaining(new PointConsumer());
 
 //в функциональном стиле
 points.forEach(value-&gt; {System.out.println(value); System.out.println(&quot;-----&quot;);});
 
 points.forEach(value -&gt; System.out.println(value));
 
 iter = points.iterator();
 iter.forEachRemaining(value -&gt; {System.out.println(&quot;через итератор: &quot; + value.toString()); System.out.println(Separatishe);});
 
 //сортируем через вспомогательный класс Collections используя реализуемый в Point компаратор
 Collections.sort(points);
 //сортируем прямо через коллекцию использую компаратор реализуемый в Point
 points.sort(null);
 
 //сортируем используя новый компаратор реализованный в анонимном классе
 points.sort(new Comparator&lt;Point&gt;(){
 @Override
 public int compare(Point p1, Point p2){
 return p1.getZ() - p2.getZ();
 }
 }); 

 //сортируем в функциональном стиле - для сравнения используется компаратор класса Point
 points.sort((value1, value2) -&gt; value1.compareTo(value2));
 
 //сортируем в функциональном стиле - компаратор реализуем тут же
 points.sort((value1, value2) -&gt; {return value1.getY() - value2.getY();});

 
 points.forEach(value -&gt; System.out.println(value.toString()));
 
 }

}
&lt;/pre&gt;</content:encoded>
			<link>https://icoder.ucoz.ru/blog/sortirovka_kollekcii_razlichnymi_sposobami/2015-09-16-76</link>
			<category>Java (Общие вопросы)</category>
			<dc:creator>alex</dc:creator>
			<guid>https://icoder.ucoz.ru/blog/sortirovka_kollekcii_razlichnymi_sposobami/2015-09-16-76</guid>
			<pubDate>Wed, 16 Sep 2015 09:44:23 GMT</pubDate>
		</item>
		<item>
			<title>Вывести отладочную информацию в Event Log Delphi</title>
			<description>&lt;p&gt;Чтобы вывести отладочную информацию в окно &quot;Event Log&quot; среды&amp;nbsp; Delphi используйте функции из модуля Windows:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;procedure OutputDebugString; external kernel32 name &apos;OutputDebugStringA&apos;;&lt;br /&gt;
procedure OutputDebugStringA; external kernel32 name &apos;OutputDebugStringA&apos;;&lt;br /&gt;
procedure OutputDebugStringW; external kernel32 name &apos;OutputDebugStringW&apos;;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Например:&lt;/p&gt;

&lt;p&gt;&amp;nbsp; OutputDebugString(&apos; ------------ Активировали --------------&apos;);&lt;/p&gt;

&lt;p&gt;&amp;nbsp; OutputDebugString(&apos;---------------&amp;nbsp; Деактивировали -----------&apos;);&lt;/p&gt;</description>
			<content:encoded>&lt;p&gt;Чтобы вывести отладочную информацию в окно &quot;Event Log&quot; среды&amp;nbsp; Delphi используйте функции из модуля Windows:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;procedure OutputDebugString; external kernel32 name &apos;OutputDebugStringA&apos;;&lt;br /&gt;
procedure OutputDebugStringA; external kernel32 name &apos;OutputDebugStringA&apos;;&lt;br /&gt;
procedure OutputDebugStringW; external kernel32 name &apos;OutputDebugStringW&apos;;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Например:&lt;/p&gt;

&lt;p&gt;&amp;nbsp; OutputDebugString(&apos; ------------ Активировали --------------&apos;);&lt;/p&gt;

&lt;p&gt;&amp;nbsp; OutputDebugString(&apos;---------------&amp;nbsp; Деактивировали -----------&apos;);&lt;/p&gt;</content:encoded>
			<link>https://icoder.ucoz.ru/blog/vyvesti_otladochnuju_informaciju_v_event_log_delphi/2015-04-01-75</link>
			<category>Разное</category>
			<dc:creator>alex</dc:creator>
			<guid>https://icoder.ucoz.ru/blog/vyvesti_otladochnuju_informaciju_v_event_log_delphi/2015-04-01-75</guid>
			<pubDate>Wed, 01 Apr 2015 06:40:45 GMT</pubDate>
		</item>
		<item>
			<title>События в CDI</title>
			<description>&lt;p&gt;Существует шаблон проектирования &quot;Наблюдатель&quot; (Observer) или &amp;laquo;подчинённые&amp;raquo; (Dependents) или &amp;laquo;издатель-подписчик&amp;raquo; (Publisher-Subscriber). Суть в том что есть класс,...</description>
			<content:encoded>&lt;p&gt;Существует шаблон проектирования &quot;Наблюдатель&quot; (Observer) или &amp;laquo;подчинённые&amp;raquo; (Dependents) или &amp;laquo;издатель-подписчик&amp;raquo; (Publisher-Subscriber). Суть в том что есть класс,$CUT$ который генерируют события и есть другие классы, которые подписываются на них. Когда главный класс зажигает событие, его обрабатывают все кто подписался на данный тип событий. CDI поддерживает данный шаблон проектирования через механизм событий. Как всегда используются несколько аннотаций.&lt;/p&gt;

&lt;p&gt;Вот класс объявляет объект событие и генерирует событие&lt;/p&gt;

&lt;pre class=&quot;brush: java&quot;&gt;
 @Inject Event&lt;buyer&gt; addBuyerEvent;

 public String addUser(){
 Buyer b = new Buyer(idGen.generate(), firstName, secondName, thirdName, phonePrefix + phone_number.pnone(), defEmail);
 buyerFacade.create(b);
 //em.persist(b);
 log.log(Level.INFO, &quot;зажигаем событие - пользователь добавлен&quot;);
 addBuyerEvent.fire(b);
 return &quot;added&quot;;
 }
&lt;/buyer&gt;&lt;/pre&gt;

&lt;p&gt;Вот другой класс обрабатывает событие. Весь механизм подписки обеспечивается контейнером CDI&lt;/p&gt;

&lt;pre class=&quot;brush: java&quot;&gt;
package common;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.enterprise.event.Observes;
import javax.inject.Inject;
import jpa.Buyer;

public class AddBuyerObserver {
 @Inject Logger log;
 
 public void AddBuyerHandler(@Observes Buyer buyer){
 log.log(Level.WARNING, &quot;Отработало событие - добавлен пользователь &quot; + buyer.getFirstname() + &quot; &quot; + buyer.getSecondname() + &quot; &quot; + buyer.getThirdname());
 }
 
}

&lt;/pre&gt;
&lt;p&gt;Если нам нужно создать несколько событий принимающих объект одного типа и отличать эти события при обработке - используются квалификаторы:&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface QAddBuyer {
}

@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface QChangeOrder {
}
&lt;/pre&gt;
Соответсвенно объявление событий и зажигание будет выглядеть так:
&lt;pre class=&quot;brush: java&quot;&gt;
 @Inject @QAddBuyer Event&lt;Buyer&gt; addBuyerEvent;
 @Inject @QChangeOrder Event&lt;Buyer&gt; changeOrderEvent;

 public String addUser(){
 Buyer b = new Buyer(idGen.generate(), firstName, secondName, thirdName, phonePrefix + phone_number.pnone(), defEmail);
 buyerFacade.create(b);
 //em.persist(b);
 log.log(Level.INFO, &quot;зажигаем событие - пользователь добавлен&quot;);
 addBuyerEvent.fire(b);
 log.log(Level.INFO, &quot;зажигаем событие - изменяем заказ&quot;);
 changeOrderEvent.fire(b);
 return &quot;added&quot;;
 }
&lt;/pre&gt;
Обработка событий будет такая:
&lt;pre class=&quot;brush: java&quot;&gt;
public class AddBuyerObserver {
 @Inject Logger log;
 
 public void AddBuyerHandler(@Observes @QAddBuyer Buyer buyer){
 log.log(Level.WARNING, &quot;Отработало событие - добавлен пользователь &quot; + buyer.getFirstname() + &quot; &quot; + buyer.getSecondname() + &quot; &quot; + buyer.getThirdname());
 }
 
 public void ChangeOrderHandler(@Observes @QChangeOrder Buyer buyer){
 log.log(Level.WARNING, &quot;Отработало событие - изменен заказ &quot; + buyer.getFirstname() + &quot; &quot; + buyer.getSecondname() + &quot; &quot; + buyer.getThirdname());
 }
 
}

&lt;/pre&gt;</content:encoded>
			<link>https://icoder.ucoz.ru/blog/sobytija_v_cdi/2014-10-16-74</link>
			<category>Java EE</category>
			<dc:creator>alex</dc:creator>
			<guid>https://icoder.ucoz.ru/blog/sobytija_v_cdi/2014-10-16-74</guid>
			<pubDate>Thu, 16 Oct 2014 07:39:39 GMT</pubDate>
		</item>
		<item>
			<title>Декораторы в CDI</title>
			<description>&lt;p&gt;Декоратор как шаблон проектирования состоит в том, чтобы обернуть целевой класс (декорируемый класс) и наделить его дополнительной функциональностью или непохожей функциональностью. CDI поддерживает шаблон проектирования декоратор...</description>
			<content:encoded>&lt;p&gt;Декоратор как шаблон проектирования состоит в том, чтобы обернуть целевой класс (декорируемый класс) и наделить его дополнительной функциональностью или непохожей функциональностью. CDI поддерживает шаблон проектирования декоратор$CUT$ вводя несколько аннотаций. Допустим у нас есть класс, который уже где-либо используется. Например он инжектирован в другой класс и вызывается оттуда. Если нам нужно изменить поведение этого класса, мы можем декорировать его и переписать функциональность.&lt;/p&gt;

&lt;p&gt;Вот есть класс:&lt;/p&gt;

&lt;pre class=&quot;brush: java&quot;&gt;
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package common;

import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;

@Named
@RequestScoped
@PhoneNumber(value = Digits.ELEVEN)
public class ElevenNumberPhone implements PhoneNumberItf {

 @Inject Logger log;
 
 @Override
 public String pnone() {
 
 log.log(Level.INFO, &quot;вызов метода pnone() ElevenNumberPhone&quot;);
 
 Random rnd = new Random();
 StringBuilder sb = new StringBuilder();
 sb.append(rnd.nextInt(9));
 sb.append(&quot;-&quot;);
 for(int i = 0; i &lt; 3; i ++){
 sb.append(rnd.nextInt(9)); 
 }
 sb.append(&quot;-&quot;);
 for(int i = 0; i &lt; 3; i ++){
 sb.append(rnd.nextInt(9)); 
 }
 sb.append(&quot;-&quot;);
 for(int i = 0; i &lt; 2; i ++){
 sb.append(rnd.nextInt(9)); 
 }
 sb.append(&quot;-&quot;);
 for(int i = 0; i &lt; 2; i ++){
 sb.append(rnd.nextInt(9)); 
 }
 return sb.toString();
 }
 
}

&lt;/pre&gt;

&lt;p&gt;Он вызывается отсюда (приведена точка инжекции)&lt;/p&gt;

&lt;pre class=&quot;brush: java&quot;&gt;
 @Inject 
 @PhoneNumber(value=Digits.ELEVEN)
 private PhoneNumberItf phone_number;
&lt;/pre&gt;

&lt;p&gt;Пишем декоратор, чтобы получить другой функционал:&lt;/p&gt;

&lt;pre class=&quot;brush: java&quot;&gt;
package common;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.decorator.Decorator;
import javax.decorator.Delegate;
import javax.inject.Inject;

@Decorator
public class ElevenNumberPhoneDecorator implements PhoneNumberItf {

 @Inject @PhoneNumber(value = Digits.ELEVEN) @Delegate
 private PhoneNumberItf pnoneNumber;
 
 @Inject Logger log;
 
 @Override
 public String pnone() {
 log.log(Level.INFO, &quot;вызов метода pnone() ElevenNumberPhoneDecorator&quot;);
 //return pnoneNumber.pnone() + &quot;---- 9999&quot;;
 return &quot;999-888-777&quot;;
 }
 
}
&lt;/pre&gt;</content:encoded>
			<link>https://icoder.ucoz.ru/blog/dekoratory_v_cdi/2014-10-16-73</link>
			<category>Java EE</category>
			<dc:creator>alex</dc:creator>
			<guid>https://icoder.ucoz.ru/blog/dekoratory_v_cdi/2014-10-16-73</guid>
			<pubDate>Thu, 16 Oct 2014 07:02:18 GMT</pubDate>
		</item>
		<item>
			<title>CDI не находит компонент для инжекции</title>
			<description>&lt;p&gt;Если CDI не находи компонент для инжекции и выдается ошибка типа: &lt;strong&gt;CDI Inject fails WELD-001408 Unsatisfied dependencies for type&lt;/strong&gt;,...</description>
			<content:encoded>&lt;p&gt;Если CDI не находи компонент для инжекции и выдается ошибка типа: &lt;strong&gt;CDI Inject fails WELD-001408 Unsatisfied dependencies for type&lt;/strong&gt;,$CUT$ мы можем либо сделать его именнованным компонентом, отметив квалификатором&lt;strong&gt; @Named&lt;/strong&gt;, либо добавить в проект настроечный файл CDI под названием &lt;strong&gt;beans.xml &lt;/strong&gt;и и прописать &lt;strong&gt;bean-discovery-mode=&quot;all&quot;&lt;/strong&gt; вот так:&lt;/p&gt;

&lt;pre class=&quot;brush: xml&quot;&gt;
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans bean-discovery-mode=&quot;all&quot; xmlns=&quot;http://xmlns.jcp.org/xml/ns/javaee&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemalocation=&quot;http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd&quot;&gt;
 &lt;/beans&gt;
&lt;/pre&gt;

&lt;p&gt;Доп ссылка по теме на &lt;a href=&quot;http://stackoverflow.com/questions/18107858/cdi-inject-fails-on-maven-embedded-glassfish-plugin-org-jboss-weld-exceptions&quot;&gt;stackoverflow&lt;/a&gt;&lt;/p&gt;</content:encoded>
			<link>https://icoder.ucoz.ru/blog/cdi_ne_nakhodit_komponent_dlja_inzhekcii/2014-10-09-72</link>
			<category>Java EE</category>
			<dc:creator>alex</dc:creator>
			<guid>https://icoder.ucoz.ru/blog/cdi_ne_nakhodit_komponent_dlja_inzhekcii/2014-10-09-72</guid>
			<pubDate>Thu, 09 Oct 2014 12:04:52 GMT</pubDate>
		</item>
		<item>
			<title>Аутентификация через область безопасности JDBC</title>
			<description>&lt;p&gt;Если нам нужно провести аутентификацию и авторизацию пользователей, информация о которых лежит в базе данных, то нужно использовать область безопасности jdbc....</description>
			<content:encoded>&lt;p&gt;Если нам нужно провести аутентификацию и авторизацию пользователей, информация о которых лежит в базе данных, то нужно использовать область безопасности jdbc.$CUT$ Для этого создадим 3 таблицы: users, groups, user_groups. Пользователи и группы связаны отношением многие ко многим через таблицу user_groups. Пароли в полльзователях хранятся в виде слепка MD5. Вот схема таблиц:&lt;/p&gt;

&lt;pre class=&quot;brush: sql&quot;&gt;
/******************************************************************************/
/*** Generated by IBExpert 25.08.2014 17:42:10 ***/
/******************************************************************************/

/******************************************************************************/
/*** Following SET SQL DIALECT is just for the Database Comparer ***/
/******************************************************************************/
SET SQL DIALECT 3;



/******************************************************************************/
/*** Tables ***/
/******************************************************************************/



CREATE TABLE USERS (
 USER_ID INTEGER NOT NULL,
 USERNAME VARCHAR(20) NOT NULL,
 &quot;PASSWORD&quot; VARCHAR(32)
);




/******************************************************************************/
/*** Primary Keys ***/
/******************************************************************************/

ALTER TABLE USERS ADD CONSTRAINT PK_USERS PRIMARY KEY (USER_ID);


/******************************************************************************/
/*** Privileges ***/
/******************************************************************************/

/******************************************************************************/
/*** Generated by IBExpert 25.08.2014 17:42:32 ***/
/******************************************************************************/

/******************************************************************************/
/*** Following SET SQL DIALECT is just for the Database Comparer ***/
/******************************************************************************/
SET SQL DIALECT 3;



/******************************************************************************/
/*** Tables ***/
/******************************************************************************/



CREATE TABLE GROUPS (
 GROUP_ID INTEGER NOT NULL,
 GROUP_NAME VARCHAR(50) NOT NULL
);




/******************************************************************************/
/*** Primary Keys ***/
/******************************************************************************/

ALTER TABLE GROUPS ADD CONSTRAINT PK_GROUPS PRIMARY KEY (GROUP_ID);


/******************************************************************************/
/*** Privileges ***/
/******************************************************************************/

/******************************************************************************/
/*** Generated by IBExpert 25.08.2014 17:42:44 ***/
/******************************************************************************/

/******************************************************************************/
/*** Following SET SQL DIALECT is just for the Database Comparer ***/
/******************************************************************************/
SET SQL DIALECT 3;



/******************************************************************************/
/*** Tables ***/
/******************************************************************************/



CREATE TABLE USER_GROUPS (
 USER_ID INTEGER NOT NULL,
 GROUP_ID INTEGER NOT NULL
);




/******************************************************************************/
/*** Primary Keys ***/
/******************************************************************************/

ALTER TABLE USER_GROUPS ADD CONSTRAINT PK_USER_GROUPS PRIMARY KEY (USER_ID, GROUP_ID);


/******************************************************************************/
/*** Foreign Keys ***/
/******************************************************************************/

ALTER TABLE USER_GROUPS ADD CONSTRAINT FK_USER_GROUPS_1 FOREIGN KEY (USER_ID) REFERENCES USERS (USER_ID);
ALTER TABLE USER_GROUPS ADD CONSTRAINT FK_USER_GROUPS_2 FOREIGN KEY (GROUP_ID) REFERENCES GROUPS (GROUP_ID);


/******************************************************************************/
/*** Privileges ***/
/******************************************************************************/

&lt;/pre&gt;

&lt;p&gt;Далее создадим вью в БД, которая объединяет пользователей и группы:&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;pre class=&quot;brush: sql&quot;&gt;
/*-------------------------------------------------------------------------*/
/* Creating new views */
/*-------------------------------------------------------------------------*/

CREATE OR ALTER VIEW V_USER_GROUPS(
 USER_ID,
 USERNAME,
 &quot;PASSWORD&quot;,
 GROUP_ID,
 GROUP_NAME)
AS
select ug.user_id, u.username, u.&quot;PASSWORD&quot;, ug.group_id, g.group_name from user_groups ug
inner join users u on ug.user_id = u.user_id
inner join groups g on ug.group_id = g.group_id
;
/*-------------------------------------------------------------------------*/
/* Restoring descriptions for views */
/*-------------------------------------------------------------------------*/

/*-------------------------------------------------------------------------*/
/* Restoring descriptions of view columns */
/*-------------------------------------------------------------------------*/

/*-------------------------------------------------------------------------*/
/* Restoring privileges */
/*-------------------------------------------------------------------------*/

GRANT SELECT, UPDATE, DELETE, INSERT ON V_USER_GROUPS TO &quot;PUBLIC&quot;;
&lt;/pre&gt;

&lt;p&gt;Теперь создаем и конфигурируем область безопасности согласно рисунку:&lt;/p&gt;

&lt;p&gt;&lt;!--IMG1--&gt;&lt;a href=&quot;http://icoder.ucoz.ru/_bl/0/49810339.jpg&quot; class=&quot;ulightbox&quot; target=&quot;_blank&quot; title=&quot;Нажмите, для просмотра в полном размере...&quot;&gt;&lt;img alt=&quot;&quot; style=&quot;margin:0;padding:0;border:0;&quot; src=&quot;http://icoder.ucoz.ru/_bl/0/s49810339.jpg&quot; align=&quot;&quot; /&gt;&lt;/a&gt;&lt;!--IMG1--&gt;&lt;/p&gt;</content:encoded>
			<link>https://icoder.ucoz.ru/blog/autentifikacija_cherez_oblast_bezopasnosti_jdbc/2014-08-25-71</link>
			<category>Java EE</category>
			<dc:creator>alex</dc:creator>
			<guid>https://icoder.ucoz.ru/blog/autentifikacija_cherez_oblast_bezopasnosti_jdbc/2014-08-25-71</guid>
			<pubDate>Mon, 25 Aug 2014 13:43:04 GMT</pubDate>
		</item>
	</channel>
</rss>