සලකා බලන්න:
List<String> someList = new ArrayList<String>();
// add "monkey", "donkey", "skeleton key" to someList
for (String item : someList) {
System.out.println(item);
}
එක් එක් සින්ටැක්ස් සඳහාfor භාවිතා නොකර සමාන ලූපය මොන වගේද ?
සලකා බලන්න:
List<String> someList = new ArrayList<String>();
// add "monkey", "donkey", "skeleton key" to someList
for (String item : someList) {
System.out.println(item);
}
එක් එක් සින්ටැක්ස් සඳහාfor භාවිතා නොකර සමාන ලූපය මොන වගේද ?
Answers:
for (Iterator<String> i = someIterable.iterator(); i.hasNext();) {
String item = i.next();
System.out.println(item);
}
ඔබට i.remove();ඔබේ ලූපය භාවිතා කිරීමට අවශ්ය නම් හෝ යම් ආකාරයකින් සත්ය අනුකාරකයට ප්රවේශ වීමට අවශ්ය නම් , ඔබට සත්යය භාවිතා for ( : )කරන්නාට නොහැකි බැවින් සත්ය අනුකාරකය හුදෙක් අනුමාන කෙරේ.
ඩෙනිස් බුවනෝ විසින් සටහන් කළ පරිදි, මෙම කේතය Iterableඅතුරු මුහුණත ක්රියාත්මක කරන ඕනෑම වස්තුවක් සඳහා ක්රියා කරයි .
එසේම, දකුණු අත පැත්තේ නම් for (:)බස් වහරක් යනු arrayවෙනුවට එක්සත් වඩා Iterableවස්තුව, අභ්යන්තර කේතය යනු int දර්ශකය ප්රති සහ චෙක්පත් එරෙහිව භාවිතා array.lengthවෙනුවට. ජාවා භාෂා පිරිවිතර බලන්න .
import java.util.Iterator;සහimport java.lang.Iterable;
java.util.Iteratorබැවින් ක්රියාත්මක Iterableනොවේ for(String s : (Iterator<String>)foo). එසේ වන්නේ ඇයි මට තේරෙනවා, නමුත් එය වේ කෝපයක්.
for(String s : (Iterable<String>)() -> foo)
එක් එක් සඳහා ඉදිකිරීම් අරා සඳහා වලංගු වේ. උදා
String[] fruits = new String[] { "Orange", "Apple", "Pear", "Strawberry" };
for (String fruit : fruits) {
// fruit is an element of the `fruits` array.
}
එය අත්යවශ්යයෙන්ම සමාන වේ
for (int i = 0; i < fruits.length; i++) {
String fruit = fruits[i];
// fruit is an element of the `fruits` array.
}
ඉතින්, සමස්ත සාරාංශය:
[nsayer] සිදුවෙමින් පවතින දෙයෙහි දීර් form ස්වරූපය පහත දැක්වේ:
for(Iterator<String> i = someList.iterator(); i.hasNext(); ) { String item = i.next(); System.out.println(item); }ඔබට i.remove () භාවිතා කිරීමට අවශ්ය නම්; ඔබේ ලූපය තුළ හෝ යම් ආකාරයකින් සත්ය අනුකාරකයට ප්රවේශ වන්න, ඔබට (:) මෝඩකම සඳහා භාවිතා කළ නොහැක, මන්ද සත්ය අනුකාරකය හුදෙක් අනුමාන කර ඇත.
එය nsayer ගේ පිළිතුරෙන් ගම්ය වේ, නමුත් "someList" යනු java.lang ක්රියාත්මක කරන ඕනෑම දෙයක් වන විට OP හි (..) සින්ටැක්ස් ක්රියාත්මක වන බව සඳහන් කිරීම වටී. එය ලැයිස්තුවක් විය යුතු නැත, java.util. එබැවින් ඔබේම වර්ග පවා මෙම වාක්ය ඛණ්ඩය සමඟ භාවිතා කළ හැකිය.
මෙම foreachලූපය එකතු, ජාවා 5 (ද "ලූප සඳහා වැඩි දියුණු" ලෙස හැඳින්වෙන), භාවිතා කිරීමට සමාන වේ java.util.Iteratorදෙයක් සඳහා ම --it ගේ සින්ටැක්ටික් සීනි. එමනිසා, එක් එක් මූලද්රව්ය එකින් එක හා පිළිවෙලට කියවන විට foreach, එය වඩාත් පහසු හා සංක්ෂිප්ත බැවින් සෑම විටම අනුකාරකයක් හරහා තෝරා ගත යුතුය.
for(int i : intList) {
System.out.println("An element in the list: " + i);
}
Iterator<Integer> intItr = intList.iterator();
while(intItr.hasNext()) {
System.out.println("An element in the list: " + intItr.next());
}
ඔබ Iteratorකෙලින්ම භාවිතා කළ යුතු අවස්ථා තිබේ . උදාහරණයක් ලෙස, කෑන් foreach(කැමැත්ත?) භාවිතා කරන අතරතුර මූලද්රව්යයක් මකා දැමීමට උත්සාහ කිරීම a ConcurrentModificationException.
foreachඑදිරිව for: මූලික වෙනස්කම්අතර ඇති එකම ප්රායෝගික වෙනසක් forහා foreachසුචිමය වස්තූන් පිළිබඳ පැමිණිල්ලේ දී, ඔබ දර්ශකය සඳහා ප්රවේශයන් නොමැත, බව ය. මූලික forපුඩුවක් අවශ්ය වූ විට උදාහරණයක් :
for(int i = 0; i < array.length; i++) {
if(i < 5) {
// Do something special
} else {
// Do other stuff
}
}
ඔබට වෙනම දර්ශකයක් int-variable සමඟ අතින් නිර්මාණය කළ හැකි වුවද foreach,
int idx = -1;
for(int i : intArray) {
idx++;
...
}
විචල්ය-විෂය පථය පරිපූර්ණ නොවන බැවින් එය නිර්දේශ නොකරයි, සහ මූලික forලූපය හුදෙක් මෙම භාවිත අවස්ථාව සඳහා සම්මත සහ අපේක්ෂිත ආකෘතියයි.
foreachඑදිරිව for: කාර්ය සාධනයඑකතු ප්රවේශ වූ විට, foreachවේ සැලකිය යුතු වේගයකින් මූලික වඩා forපුඩුවක් ගේ මාලාවක් ප්රවේශය. කෙසේ වෙතත්, අරා වලට ප්රවේශ වන විට - අවම වශයෙන් ප්රාථමික හා එතීෙම් අරා සමඟ - දර්ශක හරහා ප්රවේශය නාටකාකාර ලෙස වේගවත් වේ.
දර්ශක ප්රවේශ වන විට හෝ අරා වල යෙදෙන අයට වඩා සියයට 23- 40 අතර වේගවත් වේ . මෙම පෝස්ට් පතුලේ ඇති පරීක්ෂණ පන්තියේ ප්රතිදානය මෙන්න, එය මූලද්රව්ය 100 ක ප්රාථමික-අරා අරාවෙහි සංඛ්යා සාරාංශ කරයි (A යනු iterator, B යනු දර්ශකය):intInteger
[C:\java_code\]java TimeIteratorVsIndexIntArray 1000000
Test A: 358,597,622 nanoseconds
Test B: 269,167,681 nanoseconds
B faster by 89,429,941 nanoseconds (24.438799231635727% faster)
[C:\java_code\]java TimeIteratorVsIndexIntArray 1000000
Test A: 377,461,823 nanoseconds
Test B: 278,694,271 nanoseconds
B faster by 98,767,552 nanoseconds (25.666236154695838% faster)
[C:\java_code\]java TimeIteratorVsIndexIntArray 1000000
Test A: 288,953,495 nanoseconds
Test B: 207,050,523 nanoseconds
B faster by 81,902,972 nanoseconds (27.844689860906513% faster)
[C:\java_code\]java TimeIteratorVsIndexIntArray 1000000
Test A: 375,373,765 nanoseconds
Test B: 283,813,875 nanoseconds
B faster by 91,559,890 nanoseconds (23.891659337194227% faster)
[C:\java_code\]java TimeIteratorVsIndexIntArray 1000000
Test A: 375,790,818 nanoseconds
Test B: 220,770,915 nanoseconds
B faster by 155,019,903 nanoseconds (40.75164734599769% faster)
[C:\java_code\]java TimeIteratorVsIndexIntArray 1000000
Test A: 326,373,762 nanoseconds
Test B: 202,555,566 nanoseconds
B faster by 123,818,196 nanoseconds (37.437545972215744% faster)
මම මෙය ද Integerඅරාව සඳහා ධාවනය කළ අතර , දර්ශක තවමත් පැහැදිලි ජයග්රාහකයා වන නමුත් වේගයෙන් සියයට 18 ත් 25 ත් අතර ප්රමාණයක් පමණි.
සඳහා Listවන Integers, කෙසේ වෙතත්, iterators පැහැදිලි ජයග්රාහකයා වේ. පරීක්ෂණ පන්තියේ int-array වෙනස් කරන්න:
List<Integer> intList = Arrays.asList(new Integer[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100});
පරීක්ෂණ ශ්රිතයට අවශ්ය වෙනස්කම් කරන්න ( int[]to List<Integer>, lengthto size(), etc.):
[C:\java_code\]java TimeIteratorVsIndexIntegerList 1000000
Test A: 3,429,929,976 nanoseconds
Test B: 5,262,782,488 nanoseconds
A faster by 1,832,852,512 nanoseconds (34.326681820485675% faster)
[C:\java_code\]java TimeIteratorVsIndexIntegerList 1000000
Test A: 2,907,391,427 nanoseconds
Test B: 3,957,718,459 nanoseconds
A faster by 1,050,327,032 nanoseconds (26.038700083921256% faster)
[C:\java_code\]java TimeIteratorVsIndexIntegerList 1000000
Test A: 2,566,004,688 nanoseconds
Test B: 4,221,746,521 nanoseconds
A faster by 1,655,741,833 nanoseconds (38.71935684115413% faster)
[C:\java_code\]java TimeIteratorVsIndexIntegerList 1000000
Test A: 2,770,945,276 nanoseconds
Test B: 3,829,077,158 nanoseconds
A faster by 1,058,131,882 nanoseconds (27.134122749113843% faster)
[C:\java_code\]java TimeIteratorVsIndexIntegerList 1000000
Test A: 3,467,474,055 nanoseconds
Test B: 5,183,149,104 nanoseconds
A faster by 1,715,675,049 nanoseconds (32.60101667104192% faster)
[C:\java_code\]java TimeIteratorVsIndexIntList 1000000
Test A: 3,439,983,933 nanoseconds
Test B: 3,509,530,312 nanoseconds
A faster by 69,546,379 nanoseconds (1.4816434912159906% faster)
[C:\java_code\]java TimeIteratorVsIndexIntList 1000000
Test A: 3,451,101,466 nanoseconds
Test B: 5,057,979,210 nanoseconds
A faster by 1,606,877,744 nanoseconds (31.269164666060377% faster)
එක් පරීක්ෂණයකදී ඒවා බොහෝ දුරට සමාන ය, නමුත් එකතු කිරීම් සමඟ, iterator ජය ගනී.
* මෙම ලිපිය පදනම් වී ඇත්තේ මා විසින් ලියන ලද පිළිතුරු දෙකක් මත ය.
තවත් තොරතුරු: වඩා කාර්යක්ෂම වන්නේ, සෑම ලූපයක් සඳහාම, හෝ ඉරේටරයක්ද?
ස්ටැක් පිටාර ගැලීම පිළිබඳ මෙම ප්රශ්නය කියවීමෙන් පසු මම මෙම සංසන්දනය-කාලය-ගත යුතු-ඕනෑම-දෙයාකාර පන්තියක් නිර්මාණය කළෙමි :
import java.text.NumberFormat;
import java.util.Locale;
/**
<P>{@code java TimeIteratorVsIndexIntArray 1000000}</P>
@see <CODE><A HREF="/programming/180158/how-do-i-time-a-methods-execution-in-java">/programming/180158/how-do-i-time-a-methods-execution-in-java</A></CODE>
**/
public class TimeIteratorVsIndexIntArray {
public static final NumberFormat nf = NumberFormat.getNumberInstance(Locale.US);
public static final void main(String[] tryCount_inParamIdx0) {
int testCount;
// Get try-count from a command-line parameter
try {
testCount = Integer.parseInt(tryCount_inParamIdx0[0]);
}
catch(ArrayIndexOutOfBoundsException | NumberFormatException x) {
throw new IllegalArgumentException("Missing or invalid command line parameter: The number of testCount for each test. " + x);
}
//Test proper...START
int[] intArray = new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100};
long lStart = System.nanoTime();
for(int i = 0; i < testCount; i++) {
testIterator(intArray);
}
long lADuration = outputGetNanoDuration("A", lStart);
lStart = System.nanoTime();
for(int i = 0; i < testCount; i++) {
testFor(intArray);
}
long lBDuration = outputGetNanoDuration("B", lStart);
outputGetABTestNanoDifference(lADuration, lBDuration, "A", "B");
}
private static final void testIterator(int[] int_array) {
int total = 0;
for(int i = 0; i < int_array.length; i++) {
total += int_array[i];
}
}
private static final void testFor(int[] int_array) {
int total = 0;
for(int i : int_array) {
total += i;
}
}
//Test proper...END
//Timer testing utilities...START
public static final long outputGetNanoDuration(String s_testName, long l_nanoStart) {
long lDuration = System.nanoTime() - l_nanoStart;
System.out.println("Test " + s_testName + ": " + nf.format(lDuration) + " nanoseconds");
return lDuration;
}
public static final long outputGetABTestNanoDifference(long l_aDuration, long l_bDuration, String s_aTestName, String s_bTestName) {
long lDiff = -1;
double dPct = -1.0;
String sFaster = null;
if(l_aDuration > l_bDuration) {
lDiff = l_aDuration - l_bDuration;
dPct = 100.00 - (l_bDuration * 100.0 / l_aDuration + 0.5);
sFaster = "B";
}
else {
lDiff = l_bDuration - l_aDuration;
dPct = 100.00 - (l_aDuration * 100.0 / l_bDuration + 0.5);
sFaster = "A";
}
System.out.println(sFaster + " faster by " + nf.format(lDiff) + " nanoseconds (" + dPct + "% faster)");
return lDiff;
}
//Timer testing utilities...END
}
for(int value : int_array) {/* loop content */}එය ඔබගේ පරීක්ෂණය මන්දගාමී වේ, මන්ද එය කෘතිමව සමාන for(int i = 0; i < int_array.length; i++) {int value = int_array[i]; /* loop content */}වන අතර එය ඔබේ පරීක්ෂණය සංසන්දනය නොකරයි.
int value = int_array[i];ආරම්භයේදීම කරන්නේ නම් ලූප්, එවිට ඔවුන් ද පුරෝකථනය භාවිතා කළ හැකිය. ඔවුන්ට යම් හේතුවක් නිසා දර්ශකයට ප්රවේශය අවශ්ය නොවන්නේ නම්, කෙටියෙන් කිවහොත්, ඒ සියල්ල සන්දර්භය මත රඳා පවතී.)
ජාවා ඉටරේටර්ස් පිළිබඳ දැනුම උපකල්පනය නොකරන පිළිතුරක් මෙන්න. එය අඩු නිරවද්යතාවයක් වුවද එය අධ්යාපනයට ප්රයෝජනවත් වේ.
ක්රමලේඛනය කරන අතරතුර අපි බොහෝ විට කේත ලියන්නේ පහත සඳහන් ආකාරයට ය:
char[] grades = ....
for(int i = 0; i < grades.length; i++) { // for i goes from 0 to grades.length
System.out.print(grades[i]); // Print grades[i]
}
Foreach syntax මඟින් මෙම පොදු රටාව වඩාත් ස්වාභාවික හා අඩු සින්ටැක්ටිකල් is ෝෂාකාරී ආකාරයකින් ලිවීමට ඉඩ ලබා දේ.
for(char grade : grades) { // foreach grade in grades
System.out.print(grade); // print that grade
}
මීට අමතරව, මෙම වාක්ය ඛණ්ඩය වලංගු වන්නේ ලැයිස්තු හෝ කට්ටල වැනි අරාව සුචිගත කිරීම සඳහා සහය නොදක්වන නමුත් ජාවා ඉටරෙබල් අතුරුමුහුණත ක්රියාත්මක කරන වස්තු සඳහා ය.
එය nsayer ගේ පිළිතුරෙන් ගම්ය වේ, නමුත් "someList" යනු java.lang ක්රියාත්මක කරන ඕනෑම දෙයක් වන විට OP හි (..) සින්ටැක්ස් ක්රියාත්මක වන බව සඳහන් කිරීම වටී. එය ලැයිස්තුවක් විය යුතු නැත, java.util. එබැවින් ඔබේම වර්ග පවා මෙම වාක්ය ඛණ්ඩය සමඟ භාවිතා කළ හැකිය.
JLS සඳහා අර්ථ දක්වා ඇති පරිදි එක් එක් ලූපයට ආකාර දෙකක් තිබිය හැකිය:
ප්රකාශන වර්ගය උප ප්රභේදයක් Iterableනම් පරිවර්තනය පහත පරිදි වේ:
List<String> someList = new ArrayList<String>();
someList.add("Apple");
someList.add("Ball");
for (String item : someList) {
System.out.println(item);
}
// IS TRANSLATED TO:
for(Iterator<String> stringIterator = someList.iterator(); stringIterator.hasNext(); ) {
String item = stringIterator.next();
System.out.println(item);
}ප්රකාශනයට අත්යවශ්යයෙන්ම අරාව වර්ගයක් තිබේ T[]නම්:
String[] someArray = new String[2];
someArray[0] = "Apple";
someArray[1] = "Ball";
for(String item2 : someArray) {
System.out.println(item2);
}
// IS TRANSLATED TO:
for (int i = 0; i < someArray.length; i++) {
String item2 = someArray[i];
System.out.println(item2);
}ජාවා 8 සාමාන්යයෙන් වඩා හොඳින් ක්රියා කරන ධාරාවන් හඳුන්වා දී ඇත. අපට ඒවා පහත පරිදි භාවිතා කළ හැකිය:
someList.stream().forEach(System.out::println);
Arrays.stream(someArray).forEach(System.out::println);
Foreach loop syntax එක:
for (type obj:array) {...}
උදාහරණයක්:
String[] s = {"Java", "Coffe", "Is", "Cool"};
for (String str:s /*s is the array*/) {
System.out.println(str);
}
ප්රතිදානය:
Java
Coffe
Is
Cool
අවවාදයයි: ඔබට foreach loop සමඟ අරාව මූලද්රව්ය වෙත පිවිසිය හැකිය, නමුත් ඔබට ඒවා ආරම්භ කළ නොහැක. ඒ සඳහා මුල් forලූපය භාවිතා කරන්න .
අවවාදයයි: ඔබ අරාවෙහි වර්ගය අනෙක් වස්තුව සමඟ සැසඳිය යුතුය.
for (double b:s) // Invalid-double is not String
ඔබට අංග සංස්කරණය කිරීමට අවශ්ය නම්, මුල් forලූපය මේ ආකාරයට භාවිතා කරන්න :
for (int i = 0; i < s.length-1 /*-1 because of the 0 index */; i++) {
if (i==1) //1 because once again I say the 0 index
s[i]="2 is cool";
else
s[i] = "hello";
}
දැන් අපි කොන්සෝලය වෙත s දමන්නේ නම්, අපට ලැබෙන්නේ:
hello
2 is cool
hello
hello
ජාවා “එක් එක් සඳහා” ලූප ඉදිකිරීම මඟින් වස්තු වර්ග දෙකක් හරහා නැවත ක්රියා කිරීමට ඉඩ ලබා දේ:
T[] (ඕනෑම වර්ගයක අරා)java.lang.Iterable<T>මෙම Iterable<T>අතුරු මුහුණත පමණක් එක් එක් ක්රමය ඇත: Iterator<T> iterator(). අතුරු මුහුණත විහිදෙන Collection<T>බැවින් මෙය වර්ගයේ වස්තු මත ක්රියා Collection<T>කරයි Iterable<T>.
විකිපීඩියාවේ සඳහන් කර ඇති පරිදි foreach loop හි සංකල්පය පහත දැක්වේ:
කෙසේවෙතත්, ලූප ඉදිකිරීම් සඳහා වෙනත් ඒවා මෙන් නොව, foreach loops සාමාන්යයෙන් පැහැදිලි කවුන්ටරයක් පවත්වා නොගනී : ඔවුන් මූලිකවම පවසන්නේ "මෙම x වාර ගණනක් කරන්න" වෙනුවට "මෙම කට්ටලයේ ඇති සියල්ලටම මෙය කරන්න" යන්නයි. මෙය එක් එක් වර්ගයෙන් සිදුවන දෝෂ මඟහරවා කේත කියවීම පහසු කරයි.
එබැවින් foreach loop හි සංකල්පය විස්තර කරන්නේ ලූපය කිසිදු පැහැදිලි කවුන්ටරයක් භාවිතා නොකරන බවයි, එයින් අදහස් වන්නේ ලැයිස්තුවේ ගමන් කිරීම සඳහා දර්ශක භාවිතා කිරීමේ අවශ්යතාවයක් නොමැති බවත් එමඟින් පරිශීලකයා එකින් එක දෝෂයෙන් බේරා ගන්නා බවත්ය. මෙම අක්රීය දෝෂයේ පොදු සංකල්පය විස්තර කිරීම සඳහා, දර්ශක භාවිතා කරමින් ලැයිස්තුවක් හරහා ගමන් කිරීම සඳහා ලූපයක උදාහරණයක් ගනිමු.
// In this loop it is assumed that the list starts with index 0
for(int i=0; i<list.length; i++){
}
නමුත් ලැයිස්තුව දර්ශක 1 සමඟ ආරම්භ වන්නේ නම්, මෙම ලූපය ව්යතිරේකයක් විසි කිරීමට යන්නේ එය දර්ශක 0 හි කිසිදු මූලද්රව්යයක් සොයාගත නොහැකි වන අතර මෙම දෝෂය ඕෆ්-වන් දෝෂයක් ලෙස හැඳින්වේ. එබැවින් මෙම එක් එක් දෝෂය වළක්වා ගැනීම සඳහා foreach loop හි සංකල්පය භාවිතා කරයි. වෙනත් වාසි ද තිබිය හැකිය, නමුත් foreach loop එකක් භාවිතා කිරීමේ ප්රධාන සංකල්පය සහ වාසිය මෙයයි.
ජාවා 8 හි ඔවුන් සෑම එකක් සඳහාම හඳුන්වා දුන්නා. එය ලැයිස්තුව භාවිතා කරමින් සිතියම් ලූප කළ හැකිය.
එක් එක් සඳහා භාවිතා කරමින් ලැයිස්තුවක් ලූප් කරන්න
List<String> someList = new ArrayList<String>();
someList.add("A");
someList.add("B");
someList.add("C");
someList.forEach(listItem -> System.out.println(listItem))
හෝ
someList.forEach(listItem-> {
System.out.println(listItem);
});
එක් එක් සඳහා භාවිතා කරමින් සිතියමක් ලූප් කරන්න
Map<String, String> mapList = new HashMap<>();
mapList.put("Key1", "Value1");
mapList.put("Key2", "Value2");
mapList.put("Key3", "Value3");
mapList.forEach((key,value)->System.out.println("Key: " + key + " Value : " + value));
හෝ
mapList.forEach((key,value)->{
System.out.println("Key : " + key + " Value : " + value);
});
for (Iterator<String> itr = someList.iterator(); itr.hasNext(); ) {
String item = itr.next();
System.out.println(item);
}
Java 7ඔබ ඇතුළු පැරණි ජාවා අනුවාද භාවිතා කිරීමෙන් foreachපහත පරිදි ලූප භාවිතා කළ හැකිය .
List<String> items = new ArrayList<>();
items.add("A");
items.add("B");
items.add("C");
items.add("D");
items.add("E");
for(String item : items){
System.out.println(item);
}
පහත දැක්වෙන්නේ foreachලූප් ඉන් භාවිතා කිරීමේ නවතම ක්රමයයිJava 8
( forEach+ ලැම්බඩා ප්රකාශනය හෝ ක්රම යොමුව සහිත ලැයිස්තුවක් ලූප් කරන්න )
//lambda
//Output : A,B,C,D,E
items.forEach(item->System.out.println(item));
//method reference
//Output : A,B,C,D,E
items.forEach(System.out::println);
වැඩි විස්තර සඳහා මෙම සබැඳිය බලන්න.
මුල් ප්රශ්නයේ "foreach" ක්රමය භාවිතා කිරීමෙන් පුනරාවර්තනයේදී ලැයිස්තුවෙන් අයිතම ඉවත් කිරීමට නොහැකි වීම වැනි යම් සීමාවන් ඇති බව සලකන්න.
නව for-loop කියවීමට පහසු වන අතර වෙනම iterator එකක අවශ්යතාවය ඉවත් කරයි, නමුත් කියවීමට-පමණක් නැවතීමේ අවසර පත්රවල පමණක් භාවිතා කළ හැකිය.
removeIfනිවැරදි මෙවලම විය හැකිය
ඔබගේ "එක් එක් සඳහා" වළක්වා ගැනීම සඳහා forEach සඳහා විකල්පයක්:
List<String> someList = new ArrayList<String>();
ප්රභේදය 1 (සරල):
someList.stream().forEach(listItem -> {
System.out.println(listItem);
});
ප්රභේදය 2 (සමාන්තර ක්රියාත්මක කිරීම (වේගවත්)):
someList.parallelStream().forEach(listItem -> {
System.out.println(listItem);
});
for(එකම නූල් භාවිතා කර ඇති බවට වග බලා ගැනීමට මා කැමති නම් පෝරමය භාවිතා කිරීමට මම කැමතියි. බහුවිධ කියවීම් ක්රියාත්මක කිරීමට ඉඩ දීමට මා කැමති නම් ධාරා ආකෘතිය භාවිතා කිරීමට මම කැමතියි.
සියලු මූලික ලූප අවුල් ඉවත් කිරීමෙන් එය ඔබේ කේතයට අලංකාරය එක් කරයි. එය ඔබගේ කේතයට පිරිසිදු පෙනුමක් ලබා දෙයි.
සාමාන්ය forපුඩුවක්:
void cancelAll(Collection<TimerTask> list) {
for (Iterator<TimerTask> i = list.iterator(); i.hasNext();)
i.next().cancel();
}
එක් එක් සඳහා භාවිතා කිරීම:
void cancelAll(Collection<TimerTask> list) {
for (TimerTask t : list)
t.cancel();
}
for-each යනු ඉටරේටරය ක්රියාත්මක කරන එකතුවක් මත තැනීමකි . ඔබේ එකතුව Iterator ක්රියාත්මක කළ යුතු බව මතක තබා ගන්න ; එසේ නොමැතිනම් ඔබට එය එක් එක් සඳහා භාවිතා කළ නොහැක.
, පහත දැක්වෙන රේඛාව ලෙස කියවන " ලැයිස්තුවේ එක් එක් TimerTask ටී සඳහා. "
for (TimerTask t : list)
එක් එක් සඳහා දෝෂ සඳහා ඇති ඉඩකඩ අඩුය. අනුකාරකය ආරම්භ කිරීම හෝ ලූප් කවුන්ටරය ආරම්භ කිරීම සහ එය අවසන් කිරීම ගැන ඔබට කරදර විය යුතු නැත (දෝෂ සඳහා විෂය පථයක් ඇති තැන).
ජාවා 8 ට පෙර, ඔබ පහත සඳහන් දෑ භාවිතා කළ යුතුය:
Iterator<String> iterator = someList.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
System.out.println(item);
}
කෙසේ වෙතත්, ජාවා 8 හි ප්රවාහයන් හඳුන්වාදීමත් සමඟ ඔබට එකම දේ අඩු වාක්ය ඛණ්ඩයකින් කළ හැකිය. උදාහරණයක් ලෙස, someListඔබට කළ හැක්කේ:
someList.stream().forEach(System.out::println);
The foreach loop, added in Java 5 (also called the "enhanced for loop"), is equivalent to using a java.util.Iterator
එය මේ වගේ දෙයක් වනු ඇත. හරිම කපටි.
for (Iterator<String> i = someList.iterator(); i.hasNext(); )
System.out.println(i.next());
පිළිබඳ හොඳ විදියක්! ඇත එක් එක් සඳහා තුළ සූර්යයා ප්රලේඛනය .
බොහෝ හොඳ පිළිතුරු පවසන පරිදි, වස්තුවකට ලූපයක් Iterable interfaceභාවිතා කිරීමට අවශ්ය නම් එය ක්රියාත්මක කළ යුතුය for-each.
මම සරල උදාහරණයක් පළ කර වෙනත් ආකාරයකින් for-eachලූපයක් ක්රියා කරන ආකාරය පැහැදිලි කිරීමට උත්සාහ කරමි .
මෙම for-eachලූපය උදාහරණයක්:
public class ForEachTest {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("111");
list.add("222");
for (String str : list) {
System.out.println(str);
}
}
}
ඉන්පසුව, අපි javapමෙම පංතිය දිරාපත් කිරීමට භාවිතා කරන්නේ නම් , අපට මෙම බයිට් කේත නියැදිය ලැබේ:
public static void main(java.lang.String[]);
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=4, args_size=1
0: new #16 // class java/util/ArrayList
3: dup
4: invokespecial #18 // Method java/util/ArrayList."<init>":()V
7: astore_1
8: aload_1
9: ldc #19 // String 111
11: invokeinterface #21, 2 // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
16: pop
17: aload_1
18: ldc #27 // String 222
20: invokeinterface #21, 2 // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
25: pop
26: aload_1
27: invokeinterface #29, 1 // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
නියැදියේ අවසාන පේළියේ සිට අපට දැකිය හැකි පරිදි, සම්පාදකයා ස්වයංක්රීයව for-eachයතුරු පදයේ භාවිතය Iteratorසම්පාදනය කරන වේලාවක භාවිතයට පරිවර්තනය කරයි . එය ක්රියාත්මක නොකරන වස්තුව, ලූපය භාවිතා කිරීමට උත්සාහ Iterable interfaceකරන Exceptionවිට එය විසි කරන්නේ මන්දැයි එය පැහැදිලි for-eachකරයි.
මෙම එක් එක් පුඩුවක් සඳහා ජාවා (ලූපය සඳහා හෙවත් වැඩි) පුඩුවක් සඳහා ක සරල වේ. වාසිය නම් ලිවීමට අඩු කේතයක් සහ කළමනාකරණය කිරීමට අඩු විචල්යයන් තිබීමයි. අවාසිය නම් ඔබට පියවර අගය මත පාලනයක් නොමැති අතර ලූප් බොඩි තුළ ඇති ලූප් දර්ශකයට ප්රවේශ නොවීමයි.
පියවරේ අගය 1 ක සරල වර්ධකයක් වන විට සහ ඔබට වර්තමාන ලූප මූලද්රව්යයට ප්රවේශය අවශ්ය වූ විට ඒවා වඩාත් සුදුසු වේ. නිදසුනක් ලෙස, වර්තමාන මූලද්රව්යය ඉදිරියෙන් හෝ පිටුපසින් නොබලා අරාවෙහි හෝ එකතුවක ඇති සෑම අංගයක්ම ලූප කිරීමට අවශ්ය නම්.
පුඩුවක් ආරම්භ කිරීමක් නොමැත, බූලියන් තත්වයක් නොමැති අතර පියවර අගය ව්යංග වන අතර එය සරල වර්ධකයකි. මේ නිසා ඒවා ලූප සඳහා සාමාන්යයට වඩා සරල යැයි සැලකේ.
ලූප සඳහා වැඩි දියුණු කරන ලද්දේ මෙම ක්රියාත්මක කිරීමේ අනුපිළිවෙල අනුගමනය කරන්න:
1) ලූප් බොඩි
2) සම්පූර්ණ අරාව හෝ එකතුව ගමන් කරන තෙක් පළමු පියවර සිට නැවත කරන්න
උදාහරණය - පූර්ණ අරා
int [] intArray = {1, 3, 5, 7, 9};
for(int currentValue : intArray) {
System.out.println(currentValue);
}
වත්මන් අගය විචල්යය මඟින් වත්මන් අගය intArray අරාව තුළ ලූප කර ඇත. පැහැදිලි පියවර අගයක් නොමැති බව සලකන්න - එය සෑම විටම 1 කින් වැඩි කිරීමකි.
මහා බඩවැලේ “in” යන්නෙහි අර්ථය යැයි සිතිය හැකිය. පුඩුවක් ප්රකාශ රාජ්යයන් සඳහා වැඩි දියුණු එසේ: intArray කට පුඩුවක් සහ වත්මන් මාලාවක් int අගය ගබඩා තුළ ඇති currentValue විචල්ය.
ප්රතිදානය:
1
3
5
7
9
උදාහරණය - නූල් අරාව
අපට එක් එක් ලූපය භාවිතා කර නූල් සමූහයක් හරහා නැවත යෙදිය හැකිය. ලූප් ප්රකාශනයේ මෙසේ සඳහන් වේ: myStrings String array හරහා ලූප් කර වත්මන් නූල් අගය වත්මන් ස්ට්රිං විචල්යය තුළ ගබඩා කරන්න .
String [] myStrings = {
"alpha",
"beta",
"gamma",
"delta"
};
for(String currentString : myStrings) {
System.out.println(currentString);
}
ප්රතිදානය:
alpha
beta
gamma
delta
උදාහරණය - ලැයිස්තුව
වැඩි දියුණු කරන ලද ලූපය java.util හරහා නැවත සැකසීමටද භාවිතා කළ හැකිය.
List<String> myList = new ArrayList<String>();
myList.add("alpha");
myList.add("beta");
myList.add("gamma");
myList.add("delta");
for(String currentItem : myList) {
System.out.println(currentItem);
}
ලූප් ප්රකාශනයේ මෙසේ සඳහන් වේ: මගේ ලැයිස්තුවේ නූල් ලැයිස්තුවට ඉහළින් ලූප් කර වත්මන් ලැයිස්තු අගය වත්මන් අයිටම් විචල්යය තුළ ගබඩා කරන්න .
ප්රතිදානය:
alpha
beta
gamma
delta
උදාහරණය - සකසන්න
වැඩි දියුණු කරන ලද ලූපය java.util.Set හරහා නැවත සැකසීමටද භාවිතා කළ හැකිය.
Set<String> mySet = new HashSet<String>();
mySet.add("alpha");
mySet.add("alpha");
mySet.add("beta");
mySet.add("gamma");
mySet.add("gamma");
mySet.add("delta");
for(String currentItem : mySet) {
System.out.println(currentItem);
}
ලූප් ප්රකාශනයේ මෙසේ සඳහන් වේ: mySet Set of Strings හරහා ලූප් කර වත්මන් Set අගය currentItem විචල්යය තුළ ගබඩා කරන්න . මෙය කට්ටලයක් බැවින් අනුපිටපත් නූල් අගයන් ගබඩා නොවන බව සලකන්න.
ප්රතිදානය:
alpha
delta
beta
gamma
මූලාශ්රය: ජාවා හි ලූප - අවසාන මාර්ගෝපදේශය
public static Boolean Add_Tag(int totalsize)
{ List<String> fullst = new ArrayList<String>();
for(int k=0;k<totalsize;k++)
{
fullst.addAll();
}
}
ජාවා සඳහා එක් එක් මෝඩකම යෙදිය හැක්කේ අරා හෝ වස්තු සඳහා පමණි . මෙම මෝඩකම ඇඟවුම් කරන්නේ එය සැබවින්ම අනුශාසකයෙකුගේ පිටුබලය ඇති බැවිනි. ඉරේටරය ක්රමලේඛකයා විසින් ක්රමලේඛනය කර ඇති අතර බොහෝ විට එහි පිහිටීම නිරීක්ෂණය කිරීම සඳහා පූර්ණ සංඛ්යා දර්ශකයක් හෝ නෝඩයක් (දත්ත ව්යුහය මත පදනම්ව) භාවිතා කරයි. කඩදාසි මත එය සාමාන්ය ලූපයකට වඩා මන්දගාමී වන අතර අවම වශයෙන් අරා සහ ලැයිස්තු වැනි “රේඛීය” ව්යුහයන් සඳහා වන නමුත් එය වැඩි සාරාංශයක් සපයයි.
වෙනත් බොහෝ පිළිතුරු නිවැරදිව පවසන පරිදි, for each loopඑකම පරණට වඩා සින්ටැක්ටික් සීනි පමණක් වන for loopඅතර සම්පාදකයා එය ලූප සඳහා එකම පැරණි බවට පරිවර්තනය කරයි.
javac (open jdk) සතුව ස්විචයක් ඇත -XD-printflat, එමඟින් සියලු සින්ටැක්ටික් සීනි ඉවත් කර ජාවා ගොනුවක් ජනනය කරයි. සම්පූර්ණ විධානය මේ වගේ
javac -XD-printflat -d src/ MyFile.java
//-d is used to specify the directory for output java file
මෙම ප්රශ්නයට පිළිතුරු සැපයීම සඳහා, මම ගොනුවක් නිර්මාණය කර for each, අනුවාද දෙකක් ලියා , එකක් සමඟ arrayසහ තවත් එකක් a list. මගේ javaගොනුව මේ වගේ.
import java.util.*;
public class Temp{
private static void forEachArray(){
int[] arr = new int[]{1,2,3,4,5};
for(int i: arr){
System.out.print(i);
}
}
private static void forEachList(){
List<Integer> list = Arrays.asList(1,2,3,4,5);
for(Integer i: list){
System.out.print(i);
}
}
}
විට මම compiledඉහත ස්විචය සමග මෙම ගොනුව, මම පහත සඳහන් ප්රතිදානය විය.
import java.util.*;
public class Temp {
public Temp() {
super();
}
private static void forEachArray() {
int[] arr = new int[]{1, 2, 3, 4, 5};
for (/*synthetic*/ int[] arr$ = arr, len$ = arr$.length, i$ = 0; i$ < len$; ++i$) {
int i = arr$[i$];
{
System.out.print(i);
}
}
}
private static void forEachList() {
List list = Arrays.asList(new Integer[]{Integer.valueOf(1), Integer.valueOf(2), Integer.valueOf(3), Integer.valueOf(4), Integer.valueOf(5)});
for (/*synthetic*/ Iterator i$ = list.iterator(); i$.hasNext(); ) {
Integer i = (Integer)i$.next();
{
System.out.print(i);
}
}
}
}
එක් එක් ලූප සඳහා අනෙක් සින්ටැක්ටික් සීනි (ඔටෝ බොක්සිං) සමඟ සරල ලූප බවට වෙනස් වී ඇති බව ඔබට පෙනේ.
List<Item> Items = obj.getItems();
for(Item item:Items)
{
System.out.println(item);
}
අයිතම වගුවේ ඇති සියලුම වස්තු වලට වඩා වෙනස් වේ.